Кто-нибудь может помочь мне разобраться в этой ошибке? «определение неявно объявленного ‘ClassA::ClassA()’»

#c

#c

Вопрос:

Вот код:

 #include <cstdlib>
#include <iostream>
using namespace std;

class classA
{                   
      protected:
                void setX(int a);

      private:
              int p;
};

classA:: classA()
{                      //error here.
 p = 0;
}

void classA:: setX(int a)
{
 p = a;    
}

int main()
{   
    system("PAUSE");
    return EXIT_SUCCESS;
}
  

Ответ №1:

Вы забыли объявить конструктор в определении класса. Объявите это в public разделе класса (если вы хотите, чтобы клиенты создавали экземпляр, используя его):

 class classA
{ 
      public: 
              classA();    // you forgot this!       
      protected:
                void setX(int a);

      private:
              int p;
};
  

Теперь вы можете написать его определение вне класса, что вы уже сделали.

Комментарии:

1. На самом деле, то, что я знаю, это то, что конструктор по умолчанию предоставляется компилятором по умолчанию. Здесь вы упомянули, что определение конструктора отсутствовало. Но я не знал, «ПОЧЕМУ» мы должны предоставлять конструктор по умолчанию, когда он уже предоставляется компилятором. Но теперь я знал, что если мы определяем конструктор по умолчанию, который не соответствует конструктору, предоставленному компилятором, нам придется определять его явно. Я не могу найти «ПОЧЕМУ». 🙂

2. @Chaitanya: Компилятор генерирует для вас конструктор по умолчанию, ЕСЛИ вы не объявляете (и не определяете) его самостоятельно. В вопросе OP попытался определить конструктор по умолчанию вне класса, не объявляя его в классе. Код неверно сформирован, и компилятор сгенерирует ошибку. Дайте мне знать, поняли ли вы это сейчас (смотрите код в вопросе, чтобы полностью понять это) .

3. Теперь я понял, в чем дело. Итак, как только мы определяем конструктор по умолчанию, он должен быть объявлен. В противном случае он будет там по умолчанию. Большое спасибо 🙂

Ответ №2:

 class classA
{                   
      protected:
                classA(); // you were missing an explicit declaration!
                void setX(int a);

      private:
              int p;
};

classA:: classA()
{ 
 p = 0;
}
  

Комментарии:

1. Я не понизил голос, но ваше отсутствующее объявление должно быть public не protected

2. @Binary почему я пропускаю public ? Объект класса не создается нигде за пределами classA или одного из его производных классов (которых нет). Очевидно, что класс уже разработан как производный от, потому что setX защищен.

Ответ №3:

classA не имеет имени элемента classA() для реализации.

 class classA
{
    // ....
    public:
       classA() ; // Missing the declaration of the default constructor.
};
  

Ответ №4:

По умолчанию предоставляется пустой конструктор: это правильно. Но если вы переопределите его, это больше не конструктор по умолчанию. Вы должны объявить и определить это. Если вы только объявляете это (без тела), это неверно: вы также должны определить это. Если вы определяете это без объявления в классе, это также ошибка. Однако вы можете «объединить» объявление и определение, написав следующим образом:

 class classA
{
    // ....
    public:
       classA() { p = 0;} 
};
  

или в этом случае еще лучше:

 class classA
{
    // ....
    public:
       classA():p(0) {} 
};