gpt4 book ai didi

c++ - 避免空指针

转载 作者:太空狗 更新时间:2023-10-29 21:14:45 24 4
gpt4 key购买 nike

我正在用 C++11 实现我自己的编程语言。

我设计的数据类型之一是 Token 类。它旨在存储从源文件中读取的 token ,以及 token 的内容、类型和遇到它的行。

标记可以是单字符符号、长字符串、数字或名称。因此它需要能够存储不同的数据类型,可以是用于符号的字符,用于数字的 double 型,以及用于名称和字符串的 std::string。

我实现它的方法是将该值存储在一个 void 指针中,并添加一个自定义枚举的属性,这有助于理解您应该将该 void 指针转换为什么类型。

当然,我可以为 Token 的每个子类型创建一个类,但在某些时候我无论如何都需要将它们全部存储为 Token*,这意味着我仍然需要有一个枚举,它可以帮助我知道我应该将 Token* 转换为什么类型。

这是它的实际代码:

enum token_type {
symbol,
number,
name,
string
};

struct Token {
void* value = nullptr;
token_type type;
unsigned int line;

Token(void* new_value, token_type new_type, unsigned int new_line):
value(new_value), type(new_type), line(new_line)
{}

~Token() {
switch (type) {
case symbol:
delete (char*) value;
break;
case number:
delete (double*) value;
break;
case name:
case string:
delete (std::string*) value;
}
}
};

什么是避免使用 void 指针和(可能)枚举的良好设计模式?每个人都一直告诉我这个设计是错误的,但我没有得到任何关于如何真正改善这种情况的建议,所以我在这里问。

最佳答案

A token can be either a single-character symbol, a lenghtful string, a number, or a name.

只要你有一个对象可以是许多事物之一,那就是和类型/不相交 union/变体。这直接映射到:

using Token = variant<char, std::string, int, Name>;

(这里的 variantboost::variant 或 C++1z 中的新功能 std::variant )。这是一个类模板,它在内部跟踪它是哪种类型,并以类型安全的方式将其公开给您。

The way I'm implementing this is by storing that value in a void pointer, and by adding an attribute of a custome enum which helps understand what type should you cast that void pointer to.

variant 基本上就是这样做的 - 除了 void* 之外,variant 是一个值类型。它是可复制的、可移动的、可分配的、值(value)可破坏的。它拥有自己的数据。如果您阅读了 Boost 教程,它将解释如何以类型安全的方式访问底层存储。

关于c++ - 避免空指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39959231/

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