2016-11-04 13 views
1

単体/二重リンクリストを可能にするために、ノード構造体をデコレートしようとしています。私は、次のコードを持っている:私は、コンパイラは私に次のエラーを与えるnode* head;C++継承された構造体

と頭を定義している

temp->next = new BasicNode; 
    temp = temp->next; 

struct node 
    {   
     Object* obj; 
    }; 

    struct BasicNode: node 
    { 
      node* next; 
    }; 

私は次のコードを使用すると、私はエラーを取得します: "struct ListAsSLL::node has no member 'next'" at temp->next行。

どうしたのですか?それとも構造化継承をするのが間違っていたのですか? あなたの時間と援助ありがとうございます。

+7

ダウンキャストとして頭を宣言する必要があります親から子へのクラスは明示的にする必要があります。 – UnholySheep

+0

'head'の宣言は何ですか? –

+3

継承は片方向に過ぎません。 'BasicNode'は' node'ですが、 'node'は' BasicNode'ではありません。 IMO 'temp'は' BasicNode * 'で' head'は 'node *'でなければなりません。 –

答えて

0

をあなたは

node* head...; 
7

headは、タイプBasicNodeです。 BasicNodenodeを継承します。つまり、headに割り当てる場合は、以上、BasicNode以上が必要です。あなたが知っていればtempはタイプBasicNodeであり、あなたがそれを使用したい(ダウンキャスト、子クラスの親として知られている)明示的なキャストが必要になります。

head = static_cast<BasicNode*>(temp); 

アップキャスト(子から親クラスへの)が必要としません。明示的なキャストたとえば、headのタイプをnodeに変更した場合は、キャストする必要はありません。 objにしかアクセスしていないので、これはおそらくあなたが望むものです。あなたは何とかまだあなたは常に明示的に再びそれをキャストすることができますheadBasicNodeなどの派生オブジェクトが含まれている知っていれば

node* head = //something..; 

//later on.. 
node* temp = new BasicNode; 
temp->obj = nl; 
head = temp; 

続いて、後に、:

BasicNode* basicNode = static_cast<BasicNode*>(head); 
関連する問題