类声明之外的方法定义

时间:2013-02-05 14:29:56

标签: c++ class declaration definition

请问如何在类声明之外用参数编写构造函数的定义?

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

5 个答案:

答案 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() {}