c++ - 工厂类型

标签 c++ design-patterns

为了创建一个算术求值器,我必须创建一个工厂,它将一个字符串作为参数,并根据该字符串返回一个不同类型的变量。

例子:

TypeFactory.make("int") return int i=0;
TypeFactory.make("float") return float f=0;

我想过很多不同的实现方式,但似乎都行不通:

我可以创建一个类 Type 及其子类 Float 和 Int,它们将由工厂返回,但是我如何才能以通用方式获取类中的值(如 Type.getVal(),它不会不存在,所以我不能在我的程序的其余部分使用它)

我希望我的问题很清楚(对我来说甚至不是很清楚!)

有人知道吗? 谢谢

编辑:

当我意识到这个问题很难理解时,我将以更一般的方式解释我必须做的事情。

目标是评估文件中的算术表达式。 示例:

int a;
float b;
float c;
a=1;
b=6;
c=a+b;

那是我的文件。 我的程序将从这些表达式构造一个树。为此,我使用了 Composite 和 Visitor 模式。但是我的问题是,我必须先区分每种类型,以便在我的访问者进行操作时判断哪个变量是哪种类型,并能够得到正确类型的结果。

最佳答案

我的理解是您想要解析和评估类型化的算术表达式。

通常的策略(在编译器中使用)是构建抽象语法树,然后评估这棵树。 你需要的模式是 http://en.wikipedia.org/wiki/Visitor_pattern .

基本上,您将程序/表达式表示为一棵节点树。 Node 是一个抽象类,具有许多派生类型,代表每种类型的表达式。 访问者模式允许您为每种类型的节点调用正确的访问者,从而决定要执行的正确代码。

struct Visitor
{
  void process(IntNode i) { int r = i.getInt(); ... }
  void process(FloatNode f) { float r = f.getFloat(); ... }
};

struct Node
{
    virtual void getProcessed(Visitor v);
};
struct IntNode : Node
{
    virtual void getProcessed(Visitor v) { v.process(*this); }
    int getInt() {...};
};

关于c++ - 工厂类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13960770/

相关文章:

c# - 我的代码中哪个代码行为更好?如何更改我的代码?

具有模板和多态性的 C++ 序列化器

design-patterns - 如何使用涉及一对多关系的表数据网关模式?

python:在 __init__ 方法中过早调用 super().__init__ ?

java - 使用哪种设计模式可以轻松添加新算法?

c++ - 建议的堆栈分配最大大小

c++ - 用于 C 或 C++ 的类似于 SWT 的 GUI 工具包

c++ - 获取Openssl证书错误中的错误字符串

c++ opencv findHomography()函数中的未定义关系

c++ - 如何从命令行运行 Eclipse IDE for C/C++(我已经安装了)