2016-03-28 4 views
-1

のconst参照を返す私はCに新たなんだ++と私はこれの戻り値の型に対処するかどうかはわかりません。C++オブジェクト

const Derived& myClass::getDerived(){} const

MYCLASSメンバ変数Base**b有する:return b[indexOfDerived];とエラーがある:私が試し

Class Derived : public Base 
{ 
    .... 
} 

reference to type 'const Derived' could not bind to an lvalue of type 'Base *'

Iも試み

#include "Base.h" 
Class myClass 
{ 
    public: 
     virtual const Derived& getDerived() const; 
    ..... 
    protected: 
     Base**b; 
} 

派生クラスは、ベースクラスから継承されます:return *this->b[indexOfDerived];、エラー:no viable conversion from returned value of type 'Part' to function return type 'const CPU'

オブジェクトのconst参照を返すにはどうすればよいですか?私は困惑している。

私は、次のコードで、コンストラクタ内の変数Base**bを初期化:不正な構文のため申し訳ありません

myClass::myClass() 
{ 
    b = new Base*[size]; 
    for(int i = 0; i < size; i++) 
    { 
      b[i] = new Base(); 
    } 
} 
.... 
// deallocating memory in destructor by using delete and delete[] 
.... 

答えて

2

あなたの初期化を考えると、それはできません。 const Derived&は、タイプDerivedのオブジェクト、またはDerivedから派生したクラスのオブジェクトのみを参照できます。

ただし、タイプがBaseのオブジェクトのみが作成されています。タイプDerivedのオブジェクトはありません。

あなたは、書面でこれを試みることができます:問題のポインタが実際にDerivedを指していない場合に例外をスローします

virtual const Derived& getDerived() const 
{ 
    return dynamic_cast<Derived const &>(*b[indexOfDerived]); 
} 

。 (あなたはどこかでnew Derivedがあるまで、それはしません)。

+0

私は実際に感謝します!私はちょうどC + +を学ぶようになり、前に "dynamic_cast <>"または "static_cast <>"を見たことがありません。私はjavaとcでのキャストを理解していますが、まだC++でのキャストにはまだ紹介されていません。ありがとうございました! –

0

まず、あなたがDerivedを返すようにしたい場合は、その後、あなたはDerived

b[i] = new Base(); 

を作成する必要がありますあなたはDerived*

const Derived& getDerived() const 
{ 
    return *static_cast<Derived const*>(b[0]); 
} 

からBase*vector<Base*>以上vector<unique_ptr<Base>>への使用を検討して変換するためにキャストする必要がありますメモリ管理と例外安全性の問題を助けます。

+0

ありがとうございました!私はC++でのキャストを学び始めています。このトピックを紹介するリンクや記事はありますか? –

+0

これはあなたを助けるでしょう:[タイプ変換](http://www.cplusplus.com/doc/tutorial/typecasting/) – Thomas

+0

ありがとう! –