gpt4 book ai didi

c++ - 由于数据类型在运行时变化而停留在设计上

转载 作者:太空宇宙 更新时间:2023-11-04 12:33:40 25 4
gpt4 key购买 nike

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

现在,我尝试使用以下两种方法解决这个问题,但都没有奏效。

方法 1:我创建了一个基类“Base”,并从中派生了 3 个类,即“IntProperty”、“FloatProperty”和“StringProperty”。现在这3个类分别有对应的int、float、string类型的成员变量和它们的getters和setters。我将公共(public)成员变量和方法保留在基类中。问题是我无法使用基类对象调用派生类的方法。为了更清楚,请提供与方法 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 类(在评论中引用)正是这样做的。它旨在存储不同类型的值。您可以检查它以确定存储的类型,您可以传递它,将它存储到设置中,等等。没有必要重新发明它。

关于c++ - 由于数据类型在运行时变化而停留在设计上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57402705/

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