复制构造函数调用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。动态施法无法覆盖所有情况(如果指向的对象是坏生物,则无法复制好生物),因此更好的方法是定义一个以生物为参数的构造函数。