1

vector< classB* > vObjectを持つclassAあります。

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 Element のポインタを返そうとしました。これが私の現在のオペレーターの実装です:

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));

これには、ポインターを削除するためにコンテナーに明示的にアクセスする必要がないという利点があります。それ以外の場合は、3 のルール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 に答える