c ++ объявляет массив другого типа - PullRequest
2 голосов
/ 03 декабря 2011

У меня есть класс, и в этом классе я хотел бы иметь массив другого класса, объявляет, какие-либо предложения о том, как это сделать?

Но когда я делаю следующее, я получаю ошибку.

 #include "classB.h"     

 Class classA
 {
 public:
 classA();


 int intArray[20];
 classB arrayOfClassB[20];
 };

Я получаю:

ошибка C2512: 'classB': нет подходящего конструктора по умолчанию.

Мой classB конструктор принимает строку.

Ответы [ 5 ]

3 голосов
/ 03 декабря 2011

Когда вы определяете массив таким образом classB arrayOfClassB[20];, каждый элемент arrayOfClassB будет создан с использованием конструктора по умолчанию classB. Поскольку вы определили конструктор в classB, который принимает строку в качестве параметра, компилятор NOT сгенерирует конструктор по умолчанию для класса B для вас. В этом случае вы должны определить конструктор по умолчанию classB() в classB, тогда ошибка исчезнет. Однако, как уже говорили другие, лучше использовать вектор.

2 голосов
/ 03 декабря 2011

Если вы хотите использовать массив (а у класса, который у вас есть, есть конструктор, который принимает строку, но не имеет конструктора по умолчанию), вы должны инициализировать его в конструкторе со списком инициализатора:

 class classA
 {
 public:
 classA();


 int intArray[20];
 classB arrayOfClassB[20];
 };

 classA::classA() : arrayOfClassB({"", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", ""}) { }

Невозможно написать аргумент для каждого экземпляра.Поэтому, если ваш массив имеет размер 20, у вас должно быть 20 строк в списке инициализатора.

Вероятно, вам не так удобно использовать вектор, подобный этому:

class classA
{
public:
classA();

int intArray[20];
vector<classB> arrayOfClassB;
};

classA::classA() : arrayOfClassB(20, classB("")) { }
1 голос
/ 03 декабря 2011

Чтобы инициализировать массив arrayOfClassB, необходимо вызвать конструктор по умолчанию, но компилятор жалуется, поскольку конструктор по умолчанию недоступен. Конструктор по умолчанию - это тот конструктор, который не принимает аргументов.

Как уже отмечали другие, вы можете либо использовать std::vector<classB>, либо предоставить конструктор по умолчанию и позже инициализировать массив.

0 голосов
/ 03 декабря 2011

Вы всегда можете определить массив как тип указателя и создать с помощью malloc

classB **array;
static const int arrayElementLength = 50;

classA()
{
    array = (classB **) malloc(sizeof(classB *) * arrayElementLength);
    for (int i=0; i<arrayElementLength; i++)
        array[i] = NULL; //or construct with something else
}

~classA()
{
    if (array)
    free(array);
}
0 голосов
/ 03 декабря 2011

вам следует рассмотреть возможность использования векторов для того, что должно служить той же цели и позволяет создавать массив ваших пользовательских классов.

C ++ Векторы

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...