c++ - 重载运算符 [] 以替换 vector 元素

标签 c++ vector operator-overloading

我有一个classA,它有一个vector< classB* > vObject

class ClassA{
public:
     ClassB** operator [] (int index);
private:
     vector<ClassB*> vObject
};

让我们假设 vObject 中填充了一些 classB* 对象。 我想要做的是能够像这样替换 vector 的 classB* 元素:

classA_obj[3] = classA_obj[5];
classA_obj[1] = classB_obj;

我试图返回 ClassB 元素的指针。 这是我当前的运算符实现:

ClassB** ClassA::operator [](int index){
    return &vObject[index]; }

之后我尝试了以下操作:

*classA_obj[3] = *classA_obj[5]

只用一个 vector 完成所有工作的代码是:

vector<ClassB*> vObject;
vObject.push_back(new ClassB(ARG1,ARG2));
vObject.push_back(new ClassB(ARG1,ARG2));
vObject[0] = vObject[1];

我真的很困惑,我认为我的代码是正确的,但它实际上不起作用。如果有人能告诉我我做错了什么,我会很高兴。

上面的代码只是我实际代码的一个示例。

最佳答案

如果您返回引用,您将能够进行您要求的替换。

class ClassA{
public:
     ClassB*& operator [] (int index) { return vObject[index]; }
private:
     std::vector<ClassB*> vObject
};

但是,您描述用法的方式似乎表明您可以轻松更改 vector 以保存 ClassB 对象而不是指针。

class ClassA{
public:
     ClassB& operator [] (int index) { return vObject[index]; }
private:
     std::vector<ClassB> vObject
};

然后不是将 new ClassB 插入 vector ,而是将 ClassB 插入:

vObject.push_back(ClassB(ARG1,ARG2));
vObject.push_back(ClassB(ARG1,ARG2));

这样做的好处是您无需显式访问容器即可删除指针。否则,您将需要更新 ClassA 以遵守 rule of three .

关于c++ - 重载运算符 [] 以替换 vector 元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11885133/

相关文章:

c++ - C++11 中的值初始化对象和 std::vector 构造函数

c++ - 重载三向比较运算符结果类型的比较运算符

c++ - 由于删除的功能,不同的 boost 版本导致 boost/核心/ref.hpp 失败

c++ - 使: execvp: gcc: Permission denied

C++ vector 数学和 OpenGL 兼容

C++ 重载运算符 << 让我做噩梦

c++ - C++ 中的移动赋值问题。非法指令 : 4

android - 为什么 eglMakeCurrent() 因 EGL_BAD_MATCH 而失败?

c++ - 在 C++ 中实现惰性赋值时出错

c++ - 使用 vector (字符串)C++