1

请问我怎样才能用类声明之外的参数编写构造函数的定义?

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();
4

5 回答 5

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.
于 2013-02-05T14:46:10.463 回答
3

B(int x):A(x); // error here

您删除了方法的主体,但忘记删除成员初始化列表

B(int x); // No error

此外,您需要在类定义的最后一个右大括号之后放置分号。

于 2013-02-05T14:32:18.210 回答
1

您将声明与实现混合在一起。它应该是:

class B : public A
{
 public:
  B(int x);
  ~B();    
}

B::B(int x):A(x){ /*this works */ };
B::~B() {}
于 2013-02-05T14:32:27.740 回答
0

这是你的代码:

class B : public A
{
 public:
  B(int x):A(x); // error here
  ~B();

}

当您执行类似~B();声明构函数的存在时,但由于您最终到达那里(注意“;”),您没有定义它。构造函数也是如此,在您标记您的行中,您调用了超级构造函数,这是一个定义,但您没有提供方法体,这仅在声明中是预期的。

要解决您的问题,只需将声明保留为B(int x);,而不指定 B 如何与 A 关联,稍后将在定义中指定。

调用超级构造函数是生成代码的一部分,调用者不需要知道这一点,这就是为什么你可以声明一个构造函数而不定义它如何构造它的超类。

于 2013-02-05T14:32:38.307 回答
0

尝试

class B : public A
{
 public:
  B(int x);
  ~B();
};

B::B(int x):A(x){ }
B::~B() {}
于 2013-02-05T14:33:08.793 回答