2017-06-03 6 views
-2

C++のポインタと参照に関してはちょっと混乱します。リンクされたリストのような関数内のポインタからオブジェクトを返す

私はポインタがnullでもかまわないことを理解しています。私のカスタムリンクリストクラスのだから、私が持っている:

ObjectNode* head; // Pointer to the first item of the list 
ObjectNode* last; // Pointer to the last item of the list 

同様に、私のObjectNodeクラスで、私は

SimObject object; // The actual Object (cannot be null) 
ObjectNode* next; // Pointer to next Node 
ObjectNode* prev; // Pointer to previous Node 

その方法を持って、私の次と前の変数を使用して、nullにすることができ

next = null; 

しかし、私のgetメソッドは、次のとおりです。

ObjectNode ObjectList::getHead() { 
    return head; 
} 

ObjectNode ObjectList::getLast() { 
    return last; 
} 

これは発生する変換エラーを示します。だから私はおそらく何か重要なことを誤解しているだろう。そして、私はそのオブジェクトをどのように返すのか分からない。

答えて

1

あなたはObjectNodeを返すべきである*

それは、NULLにすることはできませんどのSimObjectだObjectNode *は、実際にはnullを指定でき、その場合に存在するには、実際のノードがありません、覚えておいてください。 GetHeadからのnull戻り値は、リストが空であることを意味します。

GetHeadを使用する場合、そのコードを呼び出すコードでは、戻り値がnullであるかどうかを確認する必要があります。

ObjectNode *head = list.GetHead(); 
if(head != null) 
{ 
    SimObject s = head->object; 
} 
:あなたはがヘッドで指さ オブジェクトを取得したい場合は

、あなたはそのための関数を作るか、返されるポインタを取る、それがnullでないかどうかを確認するか持って、そのオブジェクトを取得します

しかし、他のコードがどのようにリストにアクセスするのか、空のリストが何を意味するのか、呼び出しコードが適切なことをしない場合にはどのように脆弱であるのかを慎重に検討する必要がありますGetHeadがnullを返すかどうかをチェックしない)。 std :: listがどのように動作するかを見てから、必要なビットだけを自分のリストに複製してください。次に、あなたのリストまたはstd :: listに入れ替えることができる最良のシナリオがあります。

"GetHead()"の代わりに "begin()"を使用し、 "end()"をnullに設定し、ObjectNode *の++演算子をオーバーロードしてObjectNode :: nextにします。そして、次のことができますを使用してカスタムリストをループ:

for(auto i = mylist.begin(); i != mylist.end(); i++) 
{ 
} 

のstd ::リストと同じ

私は、私もNULL値のクラスの外にチェックする必要があると考えていなかった を参照してください
+0

ああ右だろう準最適です 私にはっきりと説明してくれてありがとう – Astantos

関連する問題