2014-12-04 2 views
0

У меня есть классПостроить пустую матрицу

class A 
{ 
    int *const e; 
    const int row, column; 
public: 
    A(int r, int c); // create a empty matrix with r rows and c columns passed in method 
} 

int main(int argc, char* argv[]) 
{ 
    A test(2,2); 
    return 0; 
} 

Вопрос в том, как я могу написать конструктор, создать матрицу, которую я могу использовать?

+0

если вы хотите какой-либо скомпилированную матрицу функциональности заглянуть в библиотеки, такие как Эйген – chris

+0

Но в этом проекте я не хочу использовать любая библиотека – Cieja

+0

'memset' - ваш друг, предполагая, что вам действительно просто нужен« пустой »(который, кстати, не имеет никакого реального смысла в разработке программного обеспечения). Кроме того, поскольку слово 'empty' появляется в заголовке вопроса, но не в теле, я понятия не имею, о чем вы действительно просите. –

ответ

0

Ваш вопрос звук как: Как сохранять параметры в постоянные свойства строки/столбца.

A::A(int r, int c): row(r), column(c), e(new int[r*c]) 
{ 
    for (int i=0; i<r*c; i++) e[i]=0; 
} 

Также не забыл деструктор:

virtual ~A(){ delete[] e; }; 

В списке параметров конструктора, параметры инициализируются в порядке декларации, так что вы не можете использовать строку/столбец (они не инициализированы).

1

Ваш конструктор будет просто

A::A(int r, int c) : row{r}, column{c} 
{ 
    e = new int[r * c]; 
} 

Тогда ваш деструктор должен быть

A::~A() 
{ 
    delete[] e; 
} 

И вы можете получить доступ к элементам, как

for (int i = 0; i < row; ++i) 
{ 
    for (int j = 0; j < column; ++j) 
    { 
     std::cout << e[i * row + j] << " "; // Using array arithmetic 
    } 
    std::cout << std::endl; 
} 
+0

e is const тоже. –

+0

Ошибка ошибка C2758: 'A :: e': член ссылочного типа должен быть инициализирован Итак, сначала нужно инициализировать переменную? – Cieja

0

Вам нужен указатель на указатель, чтобы создать [нормальный] 2-мерный массив так

int ** const e; 

Тогда конструктор может работать как:

e = (int**) malloc(sizeof(int**) * a); 
for(int i=0;i<a;++i) { 
    e[i] = (int*) malloc(sizeof(int*) * b); 
} 

Ваша следующая проблема «как для инициализации констант ». Для этого, вы можете обратиться к ответу здесь: how to initialize const member variable in a class C++

осуществить это, поместите код inittializer в функции:

initConstArray(const int** const a, int r, int c) { 
    e = (int**) malloc(sizeof(int**) * a); 
    for(int i=0;i<r;++i) { 
     e[i] = (int*) malloc(sizeof(int*) * b); 
     for(int j = 0;j < c; ++j) { 
     e[i][j] = a[i][j]; 
    } 

и вызвать эту функцию из списка конструктор инициализатора:

A(int **a, int r, int c) : initConstArray(a, r, c) { 
} 
+0

malloc? Я могу рассмотреть использование жестко закодированного указателя вместо интеллектуальных указателей, но это слишком устарело для меня. –

+0

Извините мой код. Именно здесь для концептуального объяснения. - Спасибо –

+0

Просто шучу :-) но да, там намного лучше. –

0

Вот еще один способ реализации матрицы с шаблонами:

#include <array> 
#include <iostream> 

template <std::size_t ROW, std::size_t COLUMN> 
class A 
{ 
    std::array<int, ROW*COLUMN> a; 
public: 
    A():a(){}; 
}; 


int main(int argc, char* argv[]) 
{ 
    A<3,3> test; 
    //test.printSize(); 
    //std::cout << test; 
    return 0; 
} 

Гораздо короче и чище.

Для того, чтобы строки комментариев на работу, вы должны добавить в класс следующие 2 функции:

void printSize(){ std::cout << ROW << "x" << COLUMN << std::endl; }; 

friend std::ostream& operator<<(std::ostream& os, A<R,C> mat){ 
    int col_count = 0; 
    for (auto id=mat.a.begin(); id!=mat.a.end(); id++){ 
     os << *id << (++col_count%C==0?"\n":" "); 
    } 

    return os; 
}; 
Смежные вопросы