1

UML図: http: //i.imgur.com/en0Nf.png

私のOOP教師は、上記の図のようなものをC ++で実装できると言っていました(ラボの割り当て用)。彼女は、このようなことができるので、2つのリストクラス(1つはBooks用、もう1つはClients用)は必要ないと述べました。

私はそれを実装し始めました、そして私はgetFromPosition(int)で立ち往生しています(それはリストの特定の位置でオブジェクトを返すことになっています)。私がやろうとしているのは、BookオブジェクトをListオブジェクトに保存することです(これは正常に機能します)。後で、これらの保存されたBookオブジェクトを返す/読み取る/変更できるようにしたいと思います。オブジェクトを返しますが、私(おそらく)本の方法を使用できるように、ある種のキャストを作成する必要があります。これも可能ですか?メソッドのコードは次のとおりです。

   Obj List::getFromPosition(int i){
            return list[i];
        }

私は十分な情報を提供したと思います(これが私の最初の質問です)。前もって感謝します!

4

2 に答える 2

3

by値を返すので、内部的にはポインタではなくオブジェクトObjのコレクションを保持していると思います。Obj

どちらが間違っています。オブジェクトのスライスに遭遇します。

まず、ポインターまたはスマートポインターを内部に保持し、Obj*またはを返す必要がありSmartPtr<Obj>ます。

第二に、キャストが必要かどうかは異なります。

派生クラス間で共通のメソッドがある場合は、おそらく基本クラスに入れる必要があります。そうでない場合は、おそらくキャストが必要です。

これが私がラフカットをする方法です:

class List
{
   std::vector<Obj*> _objects;
public:
   Obj* getFromPosition(int i)
   {
      return _objects[i];
   }
};

//...
List list;
//...
Obj* obj = list.getFromPosition(0);

obj->commonMethod();   //common method is virtual and a member of Obj
(dynamic_cast<Book*>(obj))->bookMethod(); //book method is only available for Book class
于 2012-05-03T20:19:19.923 に答える
0

関数にを返すようにするだけBookです。

于 2012-05-03T20:19:27.207 に答える