复制构造函数调用C++; 所以我对C++中的复制构造函数感到困惑。我有以下代码: class creature /* abstract class*/ { private: string name; int longevity; creature_society * cs; public: creature(int,int,int,creature_society*); //creature(const creature&); virtual ~creature(); virtual int is_a_good() =0; }; class good_creature : public creature { public: good_creature(int,int,creature_society*); //good_creature(const good_creature&); ~good_creature(); int is_a_good() //returns 1 }; class bad_creature : public creature { public: bad_creature(int,int,creature_society*); //bad_creature(const bad_creature&); ~bad_creature(); int is_a_good(void); //returns 0 } society = new creature*[M]; for(i=0;i<M;i++) { if(condition) society[i] = new good_creature(L,good,this); else society[i] = new bad_creature(L,bad,this); }

复制构造函数调用C++; 所以我对C++中的复制构造函数感到困惑。我有以下代码: class creature /* abstract class*/ { private: string name; int longevity; creature_society * cs; public: creature(int,int,int,creature_society*); //creature(const creature&); virtual ~creature(); virtual int is_a_good() =0; }; class good_creature : public creature { public: good_creature(int,int,creature_society*); //good_creature(const good_creature&); ~good_creature(); int is_a_good() //returns 1 }; class bad_creature : public creature { public: bad_creature(int,int,creature_society*); //bad_creature(const bad_creature&); ~bad_creature(); int is_a_good(void); //returns 0 } society = new creature*[M]; for(i=0;i<M;i++) { if(condition) society[i] = new good_creature(L,good,this); else society[i] = new bad_creature(L,bad,this); },c++,abstract-class,copy-constructor,C++,Abstract Class,Copy Constructor,所以我有一个抽象类叫做生物,一个好生物和一个坏生物,它们是生物的子类 在我的程序中,我还有一个名为society的数组,它具有生物*对象的类型。如果我的生物在某个条件下被定义为良好生物,我会为它分配空间,并将其作为良好生物存储在社会数组中。同样的情况也发生在坏生物身上。我按照以下代码中的描述构造它: class creature /* abstract class*/ { private: string name; int longevity;

所以我有一个抽象类叫做
生物
,一个
好生物
和一个
坏生物
,它们是
生物
的子类

在我的程序中,我还有一个名为
society
的数组,它具有
生物*
对象的类型。如果我的生物在某个条件下被定义为良好生物,我会为它分配空间,并将其作为良好生物存储在
社会
数组中。同样的情况也发生在坏生物身上。我按照以下代码中的描述构造它:

class creature   /* abstract class*/
{
    private:
        string name;
        int longevity;
        creature_society * cs;
    public:
        creature(int,int,int,creature_society*);
        //creature(const creature&);
        virtual ~creature();

        virtual int is_a_good() =0;
};

class good_creature : public creature
{
     public:
         good_creature(int,int,creature_society*);
         //good_creature(const good_creature&);
         ~good_creature();

         int is_a_good() //returns 1
};

class bad_creature : public creature
{
    public:
         bad_creature(int,int,creature_society*);
         //bad_creature(const bad_creature&);
         ~bad_creature();

          int is_a_good(void); //returns 0
}
society = new creature*[M];
for(i=0;i<M;i++)
{
      if(condition)
            society[i] = new good_creature(L,good,this);
      else
            society[i] = new bad_creature(L,bad,this);
}
我得到一个错误,因为
社会[cop\u pos]
属于
生物*
。我试着把它扔给好生物,但不幸的是,我总是出错。是因为我没有正确调用复制构造函数,还是因为我没有正确地转换?有什么想法吗?这件事已经折磨了我两天了。请记住,我是个新手,可能做错了什么

另外,我不需要定义自己的复制构造函数,因为
社会[I]
中的所有元素都指向由
生物社会*cs
定义的同一个对象,所以我尝试使用默认构造函数,因为我不需要深度复制

谢谢你抽出时间

更新

一个我忘了提及的阶级和我构建社会的方式

class creature_society
{
    private:
        int N; // number of the creatures we want to be made in society
        creature ** society;
    public:
        creature_society(int,int);
        ~creature_society();
 };

问题是
社会
生物
的数组,而不是
好生物
,因此复制构造函数不适用

您可以为
好生物
坏生物
定义构造函数,并将生物作为参数:

good_creature(const creature&);

你不知道
society[cop\u pos]
是否是正确的类型,因此你无法安全地施放。更好的解决方案是使用虚拟函数创建副本

class creature {
public:
    virtual creature* clone() const = 0;
    ...
};
class good_creature {
public:
    good_creature* clone() { return new good_creature(*this); }
    ...
};
//Similar for bad_creature (and any other derived classes)
在您的情况下,您可以这样称呼它:
society[pos]=society[cur_pos]->clone()


不需要知道要克隆的对象的类型。虚拟函数调用将为您解决这一问题。请注意,
好生物::克隆
返回一个
好生物*
,而不是
生物*
。这是一个有效的重载。允许虚函数重载返回派生类。在这种情况下,您还可以让它返回一个
生物*

使用多态性和虚拟调度为您完成工作

在生物类中定义克隆虚拟函数

class creature
{
    virtual creature * clone() = 0;
}
然后在子对象中覆盖它:

class good_creature: public creature
{
    virtual creature * clone() override
    {
        return new good_creature(*this);
    }
}
对于坏生物也是如此

然后使用它:

society[pos] = society[pos - 1]->clone();

旁注:您的设计似乎受到Java等语言的影响。这不是(现代的)C++风格。例如,在现代C++中,所有权比代码更有效,而不是指针。这将使代码更干净、更安全

我很难理解你的设计。你怎么知道
社会[cop\u pos]
是一个
好生物而不是
坏生物
?你为什么需要克隆功能?类型
生物社会
定义在哪里?@Kevin我刚才举了一个
好生物::克隆的例子。如果在另一个函数中定义了
好生物
坏生物
。我已经检查了另一个函数中的
社会[cop\u pos]
是好是坏。好的多态代码使用虚拟函数根据类型具有不同的行为。你不应该自己检查类型。调用对象上的虚拟函数,而不是尝试强制转换它。没有其他方法使用默认构造函数吗?喜欢使用石膏吗?我必须自己做吗?是的,你可以做:
society[pos]=新的好生物(*(动态演员阵容(society[cop\u pos]))但我不建议这样做,因为真正的
社会[cop\u pos]
是未知的,在更复杂的情况下,这就是未定义行为的方式。在我的例子中,我测试
社会[cop\u pos]
是一个
好生物还是一个坏生物`然后将它发送到我的函数。你用这句话来接近社会[pos]=新的好生物(*(动态施法(社会[cop_pos]))实际上完美地运行了我的程序。您是否因为使用了
new
操作符而使用了
dynamic\u cast
?你能详细说明一下吗?我会很感激的。感谢您的回答。动态强制转换用于执行向上强制转换和安全向下强制转换,即确定对象是否属于继承层次结构中的特定类型。这意味着如果施法失败,它可能返回NULL。动态施法无法覆盖所有情况(如果指向的对象是坏生物,则无法复制好生物),因此更好的方法是定义一个以生物为参数的构造函数。