gpt4 book ai didi

C++:在堆分配之前使用 typeid

转载 作者:行者123 更新时间:2023-11-28 07:46:41 26 4
gpt4 key购买 nike

class A
{
protected:
int a;
public:
A();
A(int);
virtual void print()=0;
virtual ~A();
};

class B: public A
{
int b;
public:
B();
B(int,int); //initialize attributes a and b
void print(); //print a and b
};

class C: public A
{
float c;
public:
C();
C(float,int); //initialize attributes a and c
void print(); //print a and c
};

class D
{
int size; //number of objects in v
A **v; /* an array(a vector) of A pointers that allows me to have both B and C type objects */
public:
D();
D(int);
D(D&);
~D();
D operator=(const D&);
void PrintAll();
};

D 的所有方法:

D::D()
{
v=NULL;
}
D::D(int x)
{
size=x;
v=new A*[x];
for(int i=0;i<x;i++)
{
if(i%2==0)
v[i]=new B(4,7);
else
v[i]=new C(3,5);
}
}

D::D(D& other)
{
size=other.size;
v=new A*[size];
for(int i=0;i<size;i++)
{
if(i%2==0)
{
v[i]=new B();
*v[i]=other.v[i][0];
}
else
{
v[i]=new C();
*v[i]=other.v[i][0];
}
}
}

D::~D()
{
if(v!=NULL)
{
for(int i=0;i<size;i++)
{
delete v[i];
}
delete[] v;
}
}
D D::operator=(const D& other)
{
if(v!=NULL)
{
for(int i=0;i<size;i++)
{
delete v[i];
}
delete[] v;
}
size=other.size;
v=new A*[size];
for(int i=0;i<size;i++)
{
if(i%2==0)
{
v[i]=new B();
*v[i]=other.v[i][0];
}
else
{
v[i]=new C();
*v[i]=other.v[i][0];
}
}
return *this;
}
void D::PrintAll()
{
cout<<"Printall():"<<endl;
for(int i=0;i<size;i++)
v[i]->print();
}

如您所见,D 类构造函数使类型为 B 或 C 的对象成为 i 是奇数或偶数。如果我知道这一点,那么我就知道如何为 D 编写 operator=copy constructor。但是如果 D 类构造函数会生成 B 或 C 类型的对象随机地,那么如何为 D 类编写复制构造函数(和 operator=)?我的猜测是我必须使用 typeid 运算符来解决这个问题。

最佳答案

将纯虚方法 clone 定义为接口(interface)的一部分 A 定义 - clone 应返回对象的拷贝。在每个 BC 类中覆盖并实现它。在 D 类中,复制构造函数和赋值运算符实现使用 A 的接口(interface)来创建所需的类实例,而不是显式调用 new:v[i] = other.v[i]->clone();。不需要 RTTI,正常的多态性就可以了。

关于C++:在堆分配之前使用 typeid,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14788304/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com