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