1

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

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

让我们假设 vObject 填充了一些 classB* 对象。 我想要做的是能够像这样替换矢量的 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<ClassB*> vObject;
vObject.push_back(new ClassB(ARG1,ARG2));
vObject.push_back(new ClassB(ARG1,ARG2));
vObject[0] = vObject[1];

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

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

4

3 回答 3

2

如果您返回参考,您将能够进行您要求的更换。

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

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

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

然后不用推new ClassB入向量,只需推ClassB

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

这样做的好处是您不需要显式访问您的容器来删除指针。否则,您将需要更新ClassA以遵守三规则

于 2012-08-09T14:00:16.373 回答
0

普通std::vector返回一个引用,所以你应该尝试一下:

ClassB*& ClassA::operator [](int index)
{
     return vObject[index]; 
} 
于 2012-08-09T14:01:36.497 回答
0
In the definition:
class A {
  public:
          ClassB*& operator [] (int index) { return vObject.at(index); };
  private:
          vector<ClassB*> vObject;
}

这是一个inline function,没有什么可做的。但是,我会检查index是否理智。

于 2012-08-09T14:03:17.900 回答