3

私は学習体験のために独自の二重リンクリストを作成しようとしています。私の本は以下のノード構造体を示しました、そして私はそれが私が作成した私のノードクラスと同等であるかどうか疑問に思いましたか?構造体のその関数は、構造体の各データ型に値を割り当てるコンストラクターの一種ですか?

//===== Struct =====

struct Node
{
    Node *next;
    Node *prev;
    std::string val;
    Node(const std::string &value, Node *nextVal = NULL, Node *prevVal = NULL) :
        val(value), next(nextVal), prev(prevVal) {}
};

//===== Class ====
class Node
{
public:
    Node(std::string value = "", Node *pVal = NULL, Node *nVal = NULL);
    virtual ~Node(void);

protected:
    Node *next;
    Node *prev;
    std::string val;
};

Node(std::string value = "", Node *pVal = NULL, Node *nVal = NULL)
{
    next = nVal;
    prev = pVal;
    val = value;
}
4

2 に答える 2

1

これはコンストラクタ初期化子リストと呼ばれ、構造体またはクラスの属性を初期化することを目的としています。

これは通常、属性を初期化するための推奨される方法です。理由を説明するディスカッションは次のとおりです。

メンバーの初期化をコンストラクター本体に延期することは可能ですか?

簡単に言うと、初期化子リストで属性を明示的に初期化しない場合、デフォルトのコンストラクターを使用して暗黙的に初期化されるため、変数を2回初期化することになります。

また、ポインタ用のアクセサが必要です。

class Node
{
public:
    Node():next(NULL),prev(NULL),val("") {};
    Node(std::string value):next(NULL),prev(NULL),val(value) {};
    Node(std::string value, Node *pVal):next(NULL),prev(pVal),val(value) {};
    Node(std::string value, Node *pVal, Node *nVal):next(nVal),prev(pVal),val(value) {};
    virtual ~Node(void);

    std::string getValue()
    {
        return val;
    }
    void setValue(std::string v)
    {
        val = v;
    }

    Node * getNext()
    {
        return next;
    }
    void setNext(Node * n)
    {
        next = n;
    }

    Node * getPrevious()
    {
        return prev;
    }
    void setPrevious(Node * n)
    {
        prev= n;
    }

protected:
    Node *next;
    Node *prev;
    std::string val;
};
于 2012-05-26T19:50:21.757 に答える
1

はい-まさにそれです。

これは、構造体コンストラクターの例を含むページです。

http://www.yolinux.com/tokyoS/LinuxTutorialC++Structures.html

于 2012-05-26T19:34:08.640 に答える