我有这段代码
class Osoba{
Osoba(char* imie,int wiek){
this->imie=new char[strlen(imie)+1];
strcpy(this->imie,imie);
this->wiek=wiek;
cout<<"Utworzono Osobe "<<this->imie<<endl;
}
Osoba(Osoba& x){
Osoba(x.imie,x.wiek);
}
[...]
当我调用复制构造函数时,它不起作用(创建并销毁对象)。
编辑: 如果我使用
Osoba(Osoba& x): Osoba(x.imie,x.wiek){
我得到type 'class Osoba' is not a direct base of 'Osoba'
这是怎么做到的?
答案 0 :(得分:10)
你不能这样调用构造函数。嗯,你可以,但会发生什么是无名的临时对象被创建。编写复制构造函数而不引用其他构造函数。此外,如果使用std :: string而不是char *,则不需要复制构造函数。如果你坚持使用char *,你还需要一个析构函数和赋值运算符。
答案 1 :(得分:3)
您必须初始化Osoba
的成员,就像在其他构造函数中一样。
您只能在C ++ 2011中重用构造函数(使用其他语法)。
答案 2 :(得分:1)
除了创建另一个不同的对象外,你不能调用构造函数。
如果需要在构造函数之间有一些共同的代码,可以将它放在一个单独的方法中并调用该方法。请注意,在构造函数中,您可以调用对象的方法,但virtual
方法不会调度派生类。
换句话说,如果你有
struct Foo
{
virtual void doit() { ... }
Foo() {
doit();
}
};
struct Bar : Foo
{
virtual void doit() { ... }
};
在Bar
的构造函数中,被调用的doit
的实现将是Foo
中定义的实现,因为在派生对象的基本部分的构造函数中,对象只是一个“基础”对象。只有在构造函数的结尾,它才会在“derived”构造函数中执行任何最终存在的代码之前成为“派生”对象。
小心其他面向对象的语言使用不同的方法......
有关C ++ see this article中完全发生的事情的解释。
如果你喜欢法律术语的描述,这就是C ++标准12.7.4中所述的内容:
会员功能,包括虚拟 函数(10.3),可以在调用期间调用 建造或毁坏(12.6.2)。 调用虚函数时 直接或间接来自 构造函数(包括来自 数据成员的mem-initializer)或 从析构函数,和对象到 调用适用的是对象 正在建设或破坏中 被调用的函数是在中定义的函数 构造函数或析构函数自己的 上课或在其中一个基地,但不是 一个函数在类中重写它 派生自构造函数或 析构函数的类,或者覆盖它 在其中一个基类中 最派生的对象(1.8)。如果 虚函数调用使用显式 类成员访问(5.2.5)和 object-expression指的是对象 正在建设或破坏但是 它的类型既不是构造函数也不是 析构函数自己的类或其中的一个 基地,通话的结果是 未定义。
答案 3 :(得分:0)
首先,构造函数不仅仅是任何方法,你不能只使用at作为mutator方法。
说, 我是否正确地认为你的班级有两个领域,imie和wiek?
再次执行init代码,这次使用x.imie和x.wiek作为输入