【发布时间】:2014-06-01 20:02:55
【问题描述】:
有很多类似的问题,我发现了使用这种模式的赞成和反对理由,所以我在这里问这个问题:
我需要在 C++ 中实现 JSON(假设它有点像家庭作业)。我想这样做:
namespace JSON {
class JSON { };
class object : public JSON, public std::unordered_map<std::string,JSON> { };
class vector : public JSON, public std::vector<JSON> { };
class string : public JSON, public std::string { };
...
};
如果你仔细想想,这一切都是有道理的。 JSON 对象“is-an”unordered_map、JSON 向量“is-a”向量等等。只是它们也是 JSON 值,例如,JSON 向量可以包含任何类型的 JSON 值(对象、向量、字符串等)。您也可以获得很多好处,然后您可以在 C++ 中“自然地”使用 JSON(您可以在 json["mystringlist"] 中有一个实际的 std::string 向量,json 实际上是一个 unordered_map)。
我并不是真正的 C++ 专家,但有什么具体的理由不这样做吗?
【问题讨论】:
-
你不能让一个类使用与其封闭命名空间相同的标识符
-
首先:将类命名为与其所在的命名空间相同的名称很少是一个好主意。这只会带来麻烦。其次,拥有 has-a 关系并创建一个模板类
JSON<T>可能是一个更好的主意,其中T是您想要反/序列化的类型。 -
我认为继承数据结构是个坏主意。我已经做了并且后悔了。授予用户的访问权限可能存在问题。
-
类名和命名空间只是示例。 @πάνταῥεῖ,如果我将其设为 JSON
,那么您如何读取 JSON 文件?您需要提前知道您需要的是 JSON 对象还是 JSON 数组并正确声明它。 -
@FlorinAsavoaie 您可能必须声明多个类来处理 JSON 文件...