gpt4 book ai didi

c++ - 是否可以编写一个抽象类,其中构造函数选择适当的子类在 C++ 中实例化?

转载 作者:太空宇宙 更新时间:2023-11-04 16:15:10 24 4
gpt4 key购买 nike

好的,希望这个问题不会重复,因为我还没有找到它。正如标题所暗示的那样,我想要一个带有两个子类的抽象类。然后我希望能够使用构造函数从这个抽象类创建一个对象,自动选择适当的子类来实际创建。我不确定这是否可行,但它似乎很有用。例如考虑以下代码片段:

#ifndef ELEMENT_H
#define ELEMENT_H

class Element
{
public:
int Type;
int* nodes;
double* xpts;
double* ypts;
double* zpts;

public: Element(int typ)
{
Type = typ;

if(typ==2) //linear 2D triangles
{
nodes = new int[3];
xpts = new double[3];
ypts = new double[3];
zpts = new double[3];
}
else if(typ==3) //linear 2D quadrangles
{
nodes = new int[4];
xpts = new double[4];
ypts = new double[4];
zpts = new double[4];
}
}
virtual int stiffnessMatrix() = 0;
virtual int massMatrix() = 0;
};



class TriLin2D : public Element
{
public:
double kmat[3][3];
double mmat[3][3];
double lvec[3];

virtual int stiffnessMatrix();
virtual int massMatrix();

public: TriLin2D(int typ) : Element(typ){}
};



class SqrLin2D : public Element
{
public:
double kmat[4][4];
double mmat[4][4];
double lvec[4];

virtual int stiffnessMatrix();
virtual int massMatrix();

public: SqrLin2D(int typ) : Element(typ){}
};

#endif

这就是我目前所拥有的。如果我想创建和对象,我会做类似的事情:

int Type=2;
TriLin2D e(Type); //creates a TriLin2D object

int Type 3;
SqrLin2D e(Type); //creates a SqrLin2D object

不过我想要的是能够做类似的事情:

int Type=2;
Element e(Type); //automatically creates an TriLin2D object based on constructor input

int Type=3;
Element e(Type); //automatically creates a SqrLin2D object based on constructor input

希望您能明白为什么这会有用。现在我不必手动更改元素子类(即 TriLin2D 或 SqrLin2D),而只需更改传递给构造函数的类型。我不确定这是否可能,如果可能,我该怎么做?谢谢。

注意:我是 C++ 的新手,所以请随时对我的编码风格发表评论。

最佳答案

构造函数无法做到这一点,但您可以创建可以做到这一点的工厂对象或函数。

Element* CreateElement(int type){
if(type==2)
return new SqeLine();
else if(type==3)
return new TriLine();
else
return nullptr;
}

这也可能是您的 Element 基类的静态成员函数。

关于c++ - 是否可以编写一个抽象类,其中构造函数选择适当的子类在 C++ 中实例化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23520378/

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