由于数据类型在运行时变化而卡在设计上

Stuck on Design due to the data type varying at run time

本文关键字:变化 数据类型 运行时      更新时间:2023-10-16

我的C++/Qt应用程序中有一个类,它有一些成员变量,其数据类型在运行时可能会有所不同,具体取决于用户选择的选项。这些成员变量具有相应的 getter 和 setter 方法。

现在,我尝试使用以下 2 种方法解决此问题,但没有一种有效。

方法1:我创建了一个基类"Base",并从中派生了3个类,即"IntProperty","FloatProperty"和"StringProperty"。现在这 3 个类分别具有 int、float 和字符串类型的相应成员变量及其 getter 和 setter。我将公共成员变量和方法保留在基类中。问题是我无法使用基类对象调用派生类的方法。请提供与方法 1 对应的代码以更清晰。

方法2:我尝试使用模板解决它,但它的问题是用户程序是一个Qt类,其中定义了Q_OBJECT宏,并且错误地说不能将模板与Q_OBJECT一起使用。为清楚起见,请参阅方法 2 的代码。

我被困在其中,想不出可以解决这个问题的设计模式或其他技术。我已经不眠不休地编程了几个晚上,如果我没有得到答案,明天就会死去。

/****************** Approach 1 ******************/
class Base
{
...
}
class IntProperty : public Base 
{
public:
int getProp() { return prop; }
private:
int prop;
}
class FloatProperty : public Base 
{
public:
double getProp() { return prop; }
private:
double prop;
}
class StringProperty : public Base 
{
public:
string getProp() { return prop; }
private:
string prop;
}
class UserProgram : public QDialog
{
Q_OBJECT
private:
Base* base;
public:
void user()
{
/// Trying to take the advantage of runtime polymorphism
Base* base = new IntProperty();
base->getProp(); /// compile time error. Ofcourse because there is no
/// method named getProp() in Base class. I am unable 
/// to define this method in base class because I cannot decide what should I keep the return type for 
/// this method.
}
}

/******************* Approach 2 *********************/
template <typename T>
class Base
{
private:
T prop;
public:
T getProp() { return prop; }
}
template <typename T>
class UserProgram() : public QDialog
{
Q_OBJECT
public:
void user() 
{
base = new Base<T>;
}
private:
Base<T>* base; /// error cannot use template with Q_OBJECT
}

QVariant 类(在注释中引用(正是这样做的。它旨在存储不同类型的值。可以检查它以确定存储的类型,也可以传递它、将其存储到设置等。没有必要重新发明它。