2

私は学習を始めたばかりでC++(から来てJava)、何かをするのにいくつかの深刻な問題があります:P 現在、私はリンクされたリストを作成しようとしていますが、何か愚かなことをしているに違いありません。 " コンパイル エラー (下にスローされている場所にマークを付けています)。誰かが私が間違っていることを手伝ってくれたら、とても感謝しています:)

また、参照、アドレス、または値による受け渡しの選択、および一般的なメモリ管理に慣れていません (現在、すべてのノードとヒープで宣言されたデータがあります)。誰かが私に一般的なアドバイスをしてくれたら、私も文句は言いません :P

LinkedListNode.cpp のキー コード

LinkedListNode::LinkedListNode()
{
    //set next and prev to null
    pData=0; //data needs to be a pointer so we can set it to null for
             //for the tail and head.
    pNext=0;
    pPrev=0;
}

/*
 * Sets the 'next' pointer to the memory address of the inputed reference.
 */
void LinkedListNode::SetNext(LinkedListNode& _next)
{
    pNext=&_next;
}

/*
 * Sets the 'prev' pointer to the memory address of the inputed reference.
 */
void LinkedListNode::SetPrev(LinkedListNode& _prev)
{
    pPrev=&_prev;
}
//rest of class

LinkedList.cpp のキー コード

#include "LinkedList.h"

LinkedList::LinkedList()
{
    // Set head and tail of linked list.
    pHead = new LinkedListNode();
    pTail = new LinkedListNode();

     /*
      * THIS IS WHERE THE ERRORS ARE.
      */
    *pHead->SetNext(*pTail);
    *pTail->SetPrev(*pHead);
}
//rest of class
4

2 に答える 2

6

*のリーディング

*pHead->SetNext(*pTail);
*pTail->SetPrev(*pHead);

必要ありません。

pHeadはノードへのポインターであり、参照渡しSetNextとしてそのメソッドを呼び出します。pHead->SetNext(..)object

->より優先度が高い*

したがって、SetNext何も返さない関数の戻り値を逆参照しようとすると、このエラーが発生します。

于 2010-04-17T05:12:11.047 に答える
3

また、参照、アドレス、または値による受け渡しの選択、および一般的なメモリ管理に慣れていません (現在、すべてのノードとヒープで宣言されたデータがあります)。誰かが私に一般的なアドバイスをしてくれたら、私も文句は言いません :P

元 Java プログラマーは常にそうしています。そして、それは逆さまです。データをヒープ割り当てすることは事実上ありません。オブジェクトはスタック上で宣言する必要があり、ヒープに割り当てられたメモリが必要な場合は、コンストラクタで割り当て、デストラクタで解放することにより、内部で処理する必要があります。

これにより、コードがよりクリーンで安全になります。

クラスメンバーも、メンバーを異なるオブジェクト間で共有する必要がある場合を除き、ポインター/参照ではなく値にする必要があります。クラスがそのメンバーを排他的に所有している場合は、それを非ポインター値型にします。そうすれば、クラス自体の内部に割り当てられ、新規/削除呼び出しを追跡する必要がなくなります。

最も単純な経験則は、必要がない限りポインタを使用しないことです。オブジェクトを別の場所に割り当てる必要がありますか? ここに割り当てて、値でアクセスできないのはなぜですか? オブジェクトを関数から返す必要がある場合や、別の関数にパラメーターとして渡す必要がある場合でも、通常はコピーによって処理されます。適切なコピー コンストラクターと代入演算子を定義し、必要に応じてオブジェクトをコピーするだけです。

于 2010-04-17T12:14:01.787 に答える