gpt4 book ai didi

c++ - 在嵌套类中对 operator[] 的调用不明确

转载 作者:行者123 更新时间:2023-11-30 03:56:08 27 4
gpt4 key购买 nike

我正在尝试制作一个具有 vector 特征的数据结构来学习一些 C++。我目前一直在尝试编译与此类似的代码:

template<typename T>
class TestClass {
public:
T* data;
TestClass(const T& t) {
data = new T{ t };
}
~TestClass(void) {}
TestClass(const TestClass&) {}

T& operator[](int k) { return *data; }
const T& operator[](int k) const { return *data; }
class NestedClass {
public:
NestedClass(void) {}
~NestedClass(void) {}
T& operator*(void) { return operator[](0); }
};

NestedClass newNestedClass(void) {
return new NestedClass();
}
};

我在嵌套类中的 operator* 函数上收到对重载函数的模糊调用。虽然我认为我遇到了问题(编译器如何知道它的 rhs/lhs)我不完全确定如何修复它。为此,我想使用 operator[] 函数。

我希望这两条打印线打印出完全相同的东西:

TestClass<int> t(1);
auto n = t.newNestedClass();
cout << t[0] << endl;
cout << *n << endl;
return 0;

有什么建议吗?

最佳答案

您为 TestClass 定义的 operator[] 绝不会“继承”或以某种方式“嵌入”在您的嵌套类中。

您可以将 C++ 嵌套类视为普通类,它们存在于“嵌套命名空间”中:示例代码中的 TestClass::NestedClass

如果您想为嵌套类使用 operator[],则必须从头开始定义一个(就像为 TestClass 所做的那样)。


编辑 1:返回类(C++ 不是 Java)

另请注意,C++ 例如Java(使用 new 分配类实例的模式,并依靠垃圾收集器自动收集“垃圾”)。
所以,像这样的代码:

   NestedClass newNestedClass(void) {
return new NestedClass();
}

甚至不应该编译。

如果你返回一个用 new 动态分配的 NestedClass 实例,你应该返回一个指向它的指针,例如:

   // Note the "*" for the returned pointer
NestedClass* newNestedClass() {
return new NestedClass();
}

但是,这更像是一种 Java 模式。

在 C++ 中,您可能只想返回一个 NestedClass 的实例,没有 new 动态分配;这应该工作得很好:

   NestedClass newNestedClass() {
return NestedClass();
}

编辑 2:适当的资源管理

另请注意,您可能希望将 T* data; 成员设置为 private 以实现更好的封装和信息隐藏。您正在提供适当的公共(public)访问器(如operator[] 重载)来访问您的类的数据:公开访问器成员函数,不是数据成员.

此外,您动态使用new 在堆上分配了data。您必须释放动态堆分配的内存,以避免内存(和资源)泄漏
一个很好的地方是你的类析构函数,例如:

class TestClass {
private:
T* data;

public:
...

~TestClass() {
// Release resoruces dynamically allocated
delete data;
}
}

还要注意这段代码:

data = new T{t};

只是动态分配一个 T 实例,将其初始化为值 t

对应的清理代码为:

delete data;

但是,如果你想动态分配一个T数组,语法是:

data = new T[elementCount];
// ... initialize data to some value...

相应的清理语法是:

delete[] data; // Note the []!!

另请注意,如果您想在类中手动管理资源,您还应考虑定义复制构造函数复制赋值 operator=()(参见所谓的 Rule of Three);如果你想实现移动语义,你还应该考虑实现移动构造函数移动赋值(在这种情况下有一个相应的 “5 条规则”)。

但是,如果您依赖于已有的 RAII 资源管理器,例如 std::vector,您就不必花费时间、精力和错误搜索、管理资源手动:全部由std::vector或您选择的任何容器类自动管理(在此在这种情况下,您有一个简单的“零规则” :) 即默认的编译器生成的复制构造函数、复制赋值运算符、移动构造函数、移动赋值运算符和析构函数将完成严格的工作。

但是,当然,如果这是一个学习练习,您可能希望自己实现那些特殊的成员函数。

关于c++ - 在嵌套类中对 operator[] 的调用不明确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28669894/

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