gpt4 book ai didi

c++ - 在 C++ 中维护对任何对象类型的引用?

转载 作者:可可西里 更新时间:2023-11-01 16:26:15 27 4
gpt4 key购买 nike

我正在尝试自学 C++,我一直使用的传统“新语言”练习之一是实现一些数据结构,例如二叉树或链表。在 Java 中,这相对简单:我可以定义一些类 Node 来维护一个实例变量 Object data ,以便有人可以在列表或树的每个节点中存储任何类型的对象。 (后来我致力于使用泛型对其进行修改;这不是这个问题的目的。)

我找不到类似的、惯用的 C++ 方式来存储“任何类型的对象”。在 C 中,我会使用 void指针;显然,同样的事情适用于 C++,但是当我构造 std::string 的实例时,我遇到了问题。并尝试将其存储到列表/树中(关于从 std::string&void* 的无效转换)。有这样的方法吗? C++ 是否具有与 Java 的对象(或 Objective-C 的 NSObject)等效的对象?

奖金问题:如果没有,我需要继续使用 void 指针,那么存储 std::string 的“正确”方法是什么?进入void* ?我偶然发现 static_cast<char*>(str.c_str()) ,但这对于我正在尝试做的事情来说似乎有点冗长。有没有更好的办法?

最佳答案

与 Java 不同,C++ 没有所有对象都继承自的基础对象。您想要做的通常方法是使用 templates .标准 C++ 库中的所有容器都使用这种方法。

与 Java 不同,C++ 不依赖多态性/继承来实现通用容器。在 Java 中,所有对象都继承自 Object,因此任何类都可以插入到采用 Object 的容器中。然而,C++ 模板是编译时结构,它指示编译器为您使用的每种类型实际生成不同的类。因此,例如,如果您有:

template <typename T>
class MyContainer { ... };

然后您可以创建一个采用 std::string 对象的 MyContainer,以及另一个采用 int 的 MyContainer。

MyContainer<std::string> stringContainer;
stringContainer.insert("Blah");

MyContainer<int> intContainer;
intContainer.insert(3342);

关于c++ - 在 C++ 中维护对任何对象类型的引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1632802/

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