gpt4 book ai didi

c++ - 在 C++ 结构中处理未知类型的最佳方法是什么?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:30:18 27 4
gpt4 key购买 nike

我正在为一种类似 Lisp 的简单编程语言编写解释器。它将代码处理成节点,所有节点都有类型,其中一些可能有索引顺序的子节点。由于信息性质的不同,我不能对所有节点值使用相同长度的类型。它们的类型名称是枚举类型,但我对值类型的唯一想法是 void *。但是当我使用它时,我必须非常小心,我想。我的意思是,我不能使用任何默认析构函数,我必须编写一个关心节点类型的析构函数。此外,我什至必须使用大量强制转换才能访问值。

这就是我要说的:

enum NodeType {/* Some node types */}

class Node
{
public:
Node(string input_code);
private:
NodeType type; // Having this I can know the type of value
void* value;
};

有没有一种方法更安全,可以编写更好的代码,但仍然与使用 void 指针一样高效?

最佳答案

我可以想到两种选择。一种是使用多态性,其中有一个抽象基类 Node 和许多特定于类型的子类。也许是这样的:

class Node
{
public:
virtual ~Node() = 0;
};

class String : public Node
{
public:
~String() {}
};

class Float : public Node
{
public:
~Float() {}
};

存储这些节点时,您将存储Node* 而不是void*。基类中(抽象)虚拟析构函数的存在使得通过基类指针正确销毁具体对象成为可能,如:

Node* obj = new String;
delete obj;

您还可以调用在基类中声明的方法,并让它们在正确的派生类中执行代码,前提是这些方法在基类中是虚拟的。这些通常也是纯虚拟的,例如:

class Node
{
public:
std::string Speak() const = 0; // pure virt
};

class String : public Node
{
public:
std::string Speak() const { return "Hello"; }
};

另一种选择是使用某种变体类。 C++ 本身没有内置到语言中的变体类,但是已经编写了一些库,例如 Boost,它提供了这样一个类。

关于c++ - 在 C++ 结构中处理未知类型的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13627616/

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