0

我有这个代码片段

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'

这是怎么做的?

4

4 回答 4

10

你不能像那样调用构造函数。好吧,你可以,但是会发生一个无名的临时对象被创建。在不引用其他构造函数的情况下编写您的复制构造函数。此外,如果您使用 std::string 而不是 char *,则不需要复制构造函数。如果你坚持使用 char *,你还需要一个析构函数和一个赋值运算符。

于 2011-05-17T12:30:19.600 回答
3

您必须初始化 的成员Osoba,就像在另一个构造函数中所做的那样。

您只能在 C++2011 中重用构造函数(使用其他语法)。

于 2011-05-17T12:32:10.953 回答
1

除了创建另一个不同的对象外,您不能调用构造函数。

如果您需要在构造函数之间有一些共同的代码,您可以将它放在一个单独的方法中并调用该方法。请注意,在构造函数中,您可以调用对象的方法,但virtual方法不会调度派生类。

换句话说,如果你有

struct Foo
{
    virtual void doit() { ... }
    Foo() {
        doit();
    }
};

struct Bar : Foo
{
    virtual void doit() { ... }
};

在构造函数Bar的执行过程doit中将被定义的那一个,Foo因为在派生对象的基部分的构造函数过程中,该对象只是一个“基”对象。只有在构造函数结束时,它才会在执行“派生”构造函数中的任何最终存在的代码之前成为“派生”对象。

小心其他面向对象的语言使用不同的方法......

有关 C++ 中究竟发生了什么的解释,请参阅这篇文章

如果您喜欢合法的描述,这就是 C++ 标准 12.7.4 中的说明:

成员函数,包括虚函数 (10.3),可以在构造或销毁 (12.6.2) 期间调用。当从构造函数(包括从数据成员的 mem-initializer)或从析构函数直接或间接调用虚函数时,调用应用的对象是正在构造或销毁的对象,调用的函数是在构造函数或析构函数自己的类或其基类之一中定义的函数,但不是在派生自构造函数或析构函数类的类中覆盖它的函数,或在最派生对象的其他基类之一中覆盖它的函数(1.8 )。如果虚函数调用使用显式类成员访问(5.2.

于 2011-05-17T12:39:46.037 回答
0

首先,构造函数不只是任何方法,你不能仅仅将 at 用作 mutator 方法。

也就是说,我认为您的班级有两个领域,imie 和 wiek,我是否正确?

只需再次执行初始化代码,这次使用 x.imie 和 x.wiek 作为输入

于 2011-05-17T12:33:06.130 回答