У меня есть класс, скажем
class XXX{
...
};
я хочу объявить глобальный массив объектов этого класса, например
XXX* arr = new XXX[50];
но, например, я объявляю в файле xxx.h (заголовочный файл класса):
extern XXX* arr;
и в файле xxx.cpp я делаю:
XXX* arr = new XXX[50];
Но Borland C ++ выдает следующие ошибки:
Не удается найти конструктор по умолчанию для инициализации элемента массива типа ‘XXX’
Когда я просто объявляю следующее в файле xxx.cpp
XXX * обр. [50];
я получаю сообщения об ошибках в других файлах cpp, таких как
Неопределенный символ обр .;
Итак, чтобы подвести итог, как я могу объявить мой массив?
ОБНОВИТЬ:
У меня есть конструктор с 3 аргументами, и я не хочу, чтобы они имели значения по умолчанию.
Кроме того, я «объявил» конструктор внутри макроса, который выглядит следующим образом:
#define PREP(num, c)\
IVT ivt##num(evInt##num,num,c);\
void interrupt evInt##num(...){\
iv[##num]->signalize();\
}
Итак, IVT ivt ## num (доказательство ## num, num, c); это конструктор класса IVT, и я хочу объявить глобальный массив указателей с элементами X.
Не удается найти конструктор по умолчанию для инициализации элемента массива типа
‘XXX’
вам нужен конструктор по умолчанию, потому что вы собираетесь использовать его для создания экземпляров вашего класса по умолчанию в этом состоянии:
XXX* arr = new XXX[50];
возможно, вы реализовали другие конструкторы, некоторые с аргументами, и именно поэтому конструктор по умолчанию не был автоматически сгенерирован компилятором для вас. Это может выглядеть так:
class XXX{
public:
XXX(){}
};
Следующий:
Когда я просто объявляю следующее в файле xxx.cpp
XXX * обр. [50];
я получаю сообщения об ошибках в других файлах cpp, таких как
Неопределенный символ обр .;
тебе нужен extern
объявление все еще в заголовке для разрешения символа в других единицах перевода. Вот что стандарт C ++ 03 говорит о том, что они из себя представляют:
В этом тексте программы хранятся в единицах, называемых исходными файлами
Международный стандарт. Исходный файл вместе со всеми заголовками
(17.4.1.2) и включенные исходные файлы (16.2) посредством предварительной обработки
директива #include, за исключением любых строк исходного текста, пропущенных любым из
Условное включение (16.1) директив предварительной обработки, называется
переводческий блок. [Примечание: программу на C ++ не обязательно переводить на
в то же время. ]
Не удается найти конструктор по умолчанию для инициализации элемента массива типа ‘XXX’
Значит, у вас нет конструктора, который не принимает никаких аргументов (то есть конструктор по умолчанию). Вы определили это в своем классе XXX? Если у вас есть конструктор, принимающий какие-либо аргументы, то компилятор не предоставляет конструктор по умолчанию.
XXX* arr = new XXX[50];
Вышеприведенный оператор вызывает конструктор по умолчанию 50 раз. Кстати, пожалуйста, дайте значимое имя класса. Это немного обидно.
Когда я просто объявляю следующее в файле xxx.cpp
Если вы объявите в .cpp
один файл, то переменная видна только текущему блоку перевода. Вам все еще нужно иметь объявление extern в заголовочном файле, чтобы другие исходные объектные файлы могли ссылаться на него.