#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) {}
};