Инициализация частного массива C / C ++ в заголовочном файле - PullRequest
4 голосов
/ 06 февраля 2009

У меня есть класс с именем Cal, и это .cpp и .h аналог

заголовочный файл имеет

class Cal {
    private:
        int wa[2][2];

    public:
        void do_cal();
};

.cpp файл имеет

#include "Cal.h"
void Cal::do_cal() {
   print(wa) // where print just itterates and prints the elements in wa
}

Мой вопрос: как мне инициализировать массив wa? Я просто не могу заставить его работать.

Я пытался с:

int wa[2][2] = {
                {5,2},
                {7,9}
               };

в заголовочном файле, но я получаю ошибки, говорящие, что я не могу сделать это, поскольку это против iso..something.

Попытался также инициализировать массив wa в конструкторе, но это тоже не сработало .. Что мне не хватает?

Спасибо

Ответы [ 3 ]

10 голосов
/ 06 февраля 2009

Если он может быть статическим, вы можете инициализировать его в вашем файле .cpp. Добавьте ключевое слово static в объявлении класса:

class Cal {
    private:
        static int wa[2][2];
    public:
        void do_cal();
};

и в области видимости файла .cpp добавить:

#include "Cal.h"
int Cal::wa[2][2] = { {5,2}, {7,9} };
void Cal::do_cal() {
   print(wa) // where print just itterates and prints the elements in wa
}

Если вы никогда не измените его, это будет хорошо работать (вместе с тем, чтобы сделать его постоянным). Вы получаете только тот, который используется для каждого экземпляра вашего класса.

7 голосов
/ 06 февраля 2009

Вы не можете инициализировать элементы массива в объявлении класса. Я недавно пытался найти способ сделать это. Из того, что я узнал, вы должны сделать это в своей функции инициализации, по одному элементу за раз.

Cal::Cal{
   wa[0][0] = 5;
   wa[0][1] = 2;
   wa[1][0] = 7;
   wa[1][1] = 9;
}

Возможно (и вероятно), что есть гораздо лучший способ сделать это, но из моего исследования на прошлой неделе, это как сделать это с многомерным массивом. Мне интересно, есть ли у кого метод получше.

5 голосов
/ 06 февраля 2009

Вы не можете сделать это легко. Если вы не хотите указывать каждый элемент отдельно, как в ответе Перчика , вы можете создать один статический массив и memcpy это (что, вероятно, будет быстрее для нетривиальных размеров массива):

namespace
{
    const int default_wa[2][2] = {{5, 2}, {7, 9}};
}

Cal::Cal
{
    memcpy(&wa[0][0], &default_wa[0][0], sizeof(wa));
}
...