gpt4 book ai didi

c++ - Qt C++ 根据组合框中的选择创建对象

转载 作者:行者123 更新时间:2023-11-28 05:20:46 24 4
gpt4 key购买 nike

由于我在面向对象代码的设计方面不是很有经验,所以我有以下问题:

我有一个组合框 cb_GRAN,其中包含 21 个条目,代表 21 个几何图形。根据在 cb_GRAN 中所做的选择,我想开始对我的几何体表面进行不同的计算(实际上还有更多:更复杂的计算,LineEdits 的开/关切换等。但为了简单起见,让`s就说说曲面的计算吧。)

为了解决这个问题,我创建了一个类 Geometry 和 21 个继承自 Geometry 的类(Geo_1、Geo_2、...Geo_21)。我还有一个虚方法

virtual void calculateSurface();

为了定义创建哪个类 Geo_x 并计算表面,我想到了以下想法:

Geometry *GEO;
QVector < Geometry*> qvec_GEO

qvec_GEO << new Geo_1()<< new Geo_2()<< new Geo_3()<<...... << new Geo_21() ;

GEO = qvec_GEO[ui->cb_GRAN->currentIndex()];
GEO->calculateSurface();
  • 这是否是解决我的问题的可行方法,或者这样做时我会遇到问题吗?
  • 创造尽可能多的东西是个好主意吗21 个对象,而我只需要一个对象?

最佳答案

问题一:您的解决方案可能会运作良好(仅基于您提供的信息)。

问题二:您完全正确,如果您只打算使用其中的 1 个或 2 个,则创建所有 21 个类的实例可能有点矫枉过正。

你必须找到一个解决方案来只实例化需要的类。 Qt 提供了一个元对象系统,您可以为此使用。基本上,您将不得不使用 QMetaType class .

首先,您必须在元对象系统中注册“Geo_N”类。您有很多解决方案可以做到这一点,但在您的情况下最好的方法可能是在类定义之后使用声明性宏:

class Geo_1 {
Q_OBJECT
void Geo_1();
};
Q_DECLARE_METATYPE(Geo_1);

请注意,如果您想在元对象注册表中注册一个类,则必须使用 Q_OBJECT 宏。

然后,您将能够动态实例化任何已注册的类型:

// The index of selected class (between 1 and 21)
int geoIndex = ui->cb_GRAN->currentIndex();

// Re-build the corresponding class name
QString typeName = "Geo_" + QString::number(geoIndex);

// Retrieve the type ID corresponding to the type name
int typeId = QMetaType::type(typeName.toStdString().c_str());

// Instantiate the corresponding class
Geometry* geo = (Geometry*) QMetaType::construct(typeId);

关于c++ - Qt C++ 根据组合框中的选择创建对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41544691/

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