2017-10-14 2 views
-1

私の問題は次のとおりです。抽象基底クラスの特殊化である2つのクラスがあります。 2クラスのコンテナである新しいクラスを作成する必要があります。C++で抽象クラスの配列を含むクラスのoperator []をどのようにオーバーロードできますか?

class Base { 
public: 
    virtual void print() =0; 
}; 

class A : public Base { 
public: 
    void print() { cout << "I am A"; }; 
}; 

class B : public Base { 
public: 
    void print() { cout << "I am B"; }; 
}; 

class ContainerBase { 
public: 
    ContainerBase() { arr = new Base*[10]; }; 
~ContainerBase() { delete[] arr; }; 
    Base & operator[](int index){ return *arr[index]; }; 
    Base & operator[](int index) const { return *arr[index]; }; 
private: 
    Base **arr; 
}; 

int main(){ 
    A a; 
    B b; 
    ContainerBase c; 
    c[0] = &a; 
    c[1] = &b; 
    return 0; 
} 

しかし、これはコンパイルされません。私は自分の問題がオペレータの過負荷にあると思うが、良い答えを見つけることができない。

コンパイルエラー:バイナリ「演算子」:「*」型の右側のオペランドをとる(または全く許容される変換は存在しない)が見つかりませんないオペレータ バイナリ「演算子は」:NOオペレータが見つかりませんがとります'B *'型の右オペランド(または許容される変換はありません)

ありがとうございました!

+1

コンパイルエラーを含めてください。 –

+0

関連しています(おそらくエラーの原因ではありません): 'int index'は' size_t index'で、 'const'バージョンは' const Base& 'を返します。 – UnholySheep

+0

構文エラーがかなりありますセミコロン。そして、 'main()'は 'int'を返さなければなりません。 – Mark

答えて

1

ContainerBaseクラスでは、arrはポインタの配列として定義されています。これは正しいです。このクラスでは、演算子[]はポインタを返します。

Base*& operator[](int index) { return arr[index]; }; 
Base* operator[](int index) const { return arr[index]; }; 

これで問題は解決します。

+0

ありがとう、私はすでにポインタを返そうとしていましたが、ポインタ上の参照が事実であることはわかりませんでした。これは今よりずっと意味をなさない! – Snoopx

関連する問題