请问如何在类声明之外用参数编写构造函数的定义?
class A{
public:
A(int x);
~A();
}
A::A(int x) { ... }
A::~A(){...}
class B : public A
{
public:
B(int x):A(x){ this work fine}
~B(){}
}
这不起作用
class B : public A
{
public:
B(int x):A(x); // error here
~B();
}
B::B(int x):A(x){ this not work };
B::~B();
答案 0 :(得分:4)
这个问题似乎收集了不寻常的错误答案(虽然有些看起来可能是疏忽造成的,而不是误解)。
情况非常简单。在类定义中,您可以拥有成员函数声明或成员函数定义。在类定义之外,您只能有一个函数定义(在这种情况下,在类定义中,您只能声明该函数,而不是定义它)。这意味着更正的代码看起来像这样:
class B : public A { // This is the class definition.
public:
B(int x); // declare member functions here.
~B();
};
// define member functions here.
//
B::B(int x) : A(x) { /* body */ }
B::~B() { /* body */ } // a declaration like `B::~B();` is not allowed here.
答案 1 :(得分:3)
B(int x):A(x); // error here
您删除了该方法的正文,但忘记删除member initialization list:
B(int x); // No error
此外,您需要在类定义的最后一个右括号后添加分号。
答案 2 :(得分:1)
您将声明与实施混合。它应该是:
class B : public A
{
public:
B(int x);
~B();
}
B::B(int x):A(x){ /*this works */ };
B::~B() {}
答案 3 :(得分:0)
这是你的代码:
class B : public A
{
public:
B(int x):A(x); // error here
~B();
}
当您执行类似~B();
的操作时,您声明存在析构函数,但是由于您最终(请注意“;”)您没有定义它。
构造函数也是如此,在您标记的行中,您调用了超级构造函数,这是一个定义,但是您没有提供方法体,只能在声明中使用。
要解决您的问题,只需将声明保留为B(int x);
,而不指定B与A的关系,稍后将在定义中指定。
调用超级构造函数是生成代码的一部分,调用者不需要知道这一点,这就是为什么你可以声明构造函数而不定义如何构造它的超类。
答案 4 :(得分:0)
尝试
class B : public A
{
public:
B(int x);
~B();
};
B::B(int x):A(x){ }
B::~B() {}