Ошибка компиляции c ++, связанная с определением конструктора / деструктора - PullRequest
24 голосов
/ 02 апреля 2009

Я пытаюсь определить конструктор и деструктор моего класса, но получаю сообщение об ошибке:

определение неявно объявленного 'x :: x ()'

Что это значит?

Часть кода:

///Constructor
StackInt::StackInt(){
    t = (-1);
    stackArray = new int[20];
};

///Destructor
StackInt::~StackInt(){
    delete[] stackArray;
}

Ответы [ 2 ]

47 голосов
/ 02 апреля 2009

В объявлении класса (возможно, в заголовочном файле) вам нужно что-то похожее на:

class StackInt {
public:
    StackInt();
    ~StackInt();  
}

Чтобы сообщить компилятору, что вам не нужны версии, сгенерированные компилятором по умолчанию (поскольку вы их предоставляете).

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

Вы можете увидеть это, используя очень простое:

class X {
        public: X();   // <- remove this.
};
X::X() {};
int main (void) { X x ; return 0; }

Скомпилируйте это, и это работает. Затем удалите строку с маркером комментария и скомпилируйте снова. Вы увидите, что ваши проблемы появятся тогда:

class X {};
X::X() {};
int main (void) { X x ; return 0; }

qq.cpp:2: error: definition of implicitly-declared `X::X()'

0 голосов
/ 25 января 2013

Следует также помнить, что все, к чему имеет доступ конструктор, должно быть общедоступным. Я получил эту ошибку раньше.

class X{
   T *data;
 public:      // <-move this to include T *
   X();
   ~X();
}

В этом коде все еще есть ошибка, потому что в моем конструкторе было следующее:

X::X(){data = new T();

Это означало, что, хотя я сделал конструктор и деструктор общедоступными, данные, с которыми они работали, все еще были частными, и я все еще получил «определение неявно объявленной» ошибки.

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