C++ 有人能帮我理解这个错误吗&引用;隐式声明的定义‘;classA::classA()’&引用;

C++ 有人能帮我理解这个错误吗&引用;隐式声明的定义‘;classA::classA()’&引用;,c++,C++,代码如下: #include <cstdlib> #include <iostream> using namespace std; class classA { protected: void setX(int a); private: int p; }; classA:: classA() { //er

代码如下:

#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;
}
#包括
#包括
使用名称空间std;
甲级
{                   
受保护的:
void setX(int a);
私人:
INTP;
};
classA::classA()
{//这里有个错误。
p=0;
}
void classA::setX(int a)
{
p=a;
}
int main()
{   
系统(“暂停”);
返回退出成功;
}

classA
没有名为
classA()的成员要实现

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

您忘记在类定义中声明构造函数。在类的
public
部分声明它(如果希望客户端使用它创建实例):


现在,您可以在已经完成的类之外编写它的定义。

默认情况下提供一个空构造函数:这是正确的。但是如果你重新定义它,它就不再是默认的构造函数了。您必须声明并定义它。如果您只声明它(没有主体),那么它是不正确的:您还必须定义它。如果您在类中没有声明的情况下定义它,那么它也是一个错误。但是,您可以通过以下方式“合并”声明和定义:

class classA
{
    // ....
    public:
       classA() { p = 0;} 
};
或者在这种情况下更好:

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

我没有投反对票,但是您缺少的声明应该是
public
而不是
protected
@Binary为什么我缺少
public
?类的对象不会在
classA
或其派生类(其中没有派生类)之外的任何位置创建。显然,这个类已经被设计为派生自,因为
setX
是受保护的。实际上,我知道的是默认构造函数是由编译器默认提供的。这里您已经提到缺少构造函数的定义。但是,我不知道为什么我们必须提供默认构造函数,而编译器已经提供了它。但是,现在我知道,如果我们定义的默认构造函数与编译器提供的构造函数不一致,那么我们必须显式地定义它。我找不到“为什么”。:)@柴坦尼亚:如果您不自己声明(并定义)一个构造函数,编译器会为您生成一个默认构造函数。在这个问题中,OP试图在类之外定义默认构造函数,而没有在类中声明它。代码格式不正确,编译器将生成错误。如果您现在理解了,请告诉我(请参阅问题中的代码以完全理解它)。我现在明白了。所以,它就像我们定义了一个默认构造函数一样,必须声明它。否则,默认情况下会有一个。非常感谢:)
class classA
{
    // ....
    public:
       classA() { p = 0;} 
};
class classA
{
    // ....
    public:
       classA():p(0) {} 
};