C++ 类声明之外的方法定义

C++ 类声明之外的方法定义,c++,class,declaration,definition,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();

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

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();
B(intx):A(x);//此处出现错误

您删除了方法主体,但忘记删除:

此外,您需要在类定义的最后一个右大括号后加上分号

B(intx):A(x);//此处出现错误

您删除了方法主体,但忘记删除:


此外,您需要在类定义的最后一个右括号后加上分号。

您将声明与实现混为一谈。应该是:

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

B::B(int x):A(x){ /*this works */ };
B::~B() {}

您将声明与实现混为一谈。应该是:

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

B::B(int x):A(x){ /*this works */ };
B::~B() {}
这是您的代码:

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

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

要解决您的问题,只需将声明保留为
B(intx),不指定B与A的关系,稍后将在定义中指定

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

这是您的代码:

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

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

要解决您的问题,只需将声明保留为
B(intx),不指定B与A的关系,稍后将在定义中指定

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

Try

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

B::B(int x):A(x){ }
B::~B() {}
试一试


这个问题似乎收集了大量不正确的答案(尽管有些答案看起来可能是疏忽的结果,而不是误解)

情况很简单。在类定义中,可以有成员函数声明或成员函数定义。在类定义之外,只能有一个函数定义(在这种情况下,在类定义之内,只能声明该函数,而不能定义它)。这意味着更正后的代码如下所示:

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.

这个问题似乎收集了大量不正确的答案(尽管有些答案看起来可能是疏忽的结果,而不是误解)

情况很简单。在类定义中,可以有成员函数声明或成员函数定义。在类定义之外,只能有一个函数定义(在这种情况下,在类定义之内,只能声明该函数,而不能定义它)。这意味着更正后的代码如下所示:

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.


嗯,我不能撤消我的下一票,因为你在它还新鲜的时候编辑了它,所以认为它还没有被编辑,因为我投票了,“初始化列表”是对这种语言功能的一个非常混乱的描述,尤其是现在我们有了
std::initializer\u list
。让我们称之为“成员初始化列表”(实名),或ctor初始化器(实名)。@LightnessRacesinOrbit我想你是对的,缩短为“初始化列表”会引起混淆。现在已经修好了,非常感谢@达斯宾莱特:欢迎大家!(我希望你能欣赏我在没有像平时那样执行
s/z/s/
时所表现出的绝对令人钦佩的克制:P)嗯,我不能撤销我的否决票,因为你在它还新鲜的时候编辑了它,所以认为它在我投票后就没有被编辑过。对于这种语言功能,“初始化列表”是一个非常混乱的描述,特别是现在我们有了
std::initializer\u list
。让我们称之为“成员初始化列表”(实名),或ctor初始化器(实名)。@LightnessRacesinOrbit我想你是对的,缩短为“初始化列表”会引起混淆。现在已经修好了,非常感谢@达斯宾莱特:欢迎大家!(我希望你能欣赏我的克制,因为我没有像平时那样执行
s/z/s/
:P)而且你也。。。也许在
B::~B
上定义一个主体?和
在方法体可以运行后…复制粘贴时会发生这种情况…:(而且你也…可能在
B::~B
?和
类之后定义一个主体,方法主体之后的
可以去…这在你复制粘贴时发生…:(不相关的可能重复:根本不需要B的析构函数。)(所有这些都混淆了优秀C++程序员的训练眼睛,这将导致相信该类违反了三的规则。)@R.MartinhoFernandes:不过,最好还是拥有它,这样以后就可以在不破坏API的情况下为它提供一个非平凡的实现!当然,按照同样的逻辑,我们应该为每种类型声明一个析构函数、复制构造函数和赋值op,这将是愚蠢的。嗯。如果它合适的话,我会发布一个关于这个的问题。谢谢你的回答.我解决了它。我重写了一个程序,问题就在别处。编译器说不;在B(int x)之后,重新定义了B::B(int x):a(x)。@PepíkSamků:别忘了写一个答案并接受它。除了……你已经是g