-3

C++ コードを記述するときは常に、メンバー関数を参照するためにポインター型と -> を使用することになります。とにかく、次のようなコードを避けることはできますか?

typedef Node *NodeRef;
typedef Graph *GraphRef;

Node{
     vector<NodeRef> nodeList;
};



Graph{
     vector<NodeRef> list;
};

    Node::Node(){
        nodeList.push_back(this);
    }

NodeRef n = new NodeRef();
n->someMemberFunction();
n->someOtherMemberFuction()->aThirdMemberFunction();

.メンバー アクセスに使用し、typedef ポインター型の代わりに元のオブジェクト型または参照を使用することは可能ですか?

4

2 に答える 2

2

まあ、まず... ポインターには何の問題もありません。ただし、いつでも参照を使用できます。

参照を使用すると、.の代わりに使用できます->。それ以上の違いがあります...しかし、それを見てください。;)

于 2013-05-17T16:57:58.527 に答える
2
NodeRef n = new NodeRef();

これはコンパイルさえしません。new Node()

1)newとにかく、なぜあなたはそれを使っているのですか? これを行うだけで何が問題なのですか:

Node n;
n.someMemberFunction();

多田!今、あなたはポインタを持っていません。

ここにポインタが必要ない場合:

n.someOtherMemberFuction()->aThirdMemberFunction();

次に、からポインターを返さないでくださいsomeOtherMemberFunction()

2) 使用する必要がある場合は、スマート ポインターを使用してオブジェクトを所有しnewます。

std::unique_ptr<Node> n(new Node);

これをしないと子猫が死んでしまい、空から血が降ってきます。

使用できない場合はまたはstd::unique_ptrを使用してください。boost::shared_ptrboost::scoped_ptr

3) ポインターが指すオブジェクトへの参照を作成できます。

std::unique_ptr<Node> np(new Node);
Node& n = *np;
n.someMemberFunction();
n.someOtherMemberFuction()->aThirdMemberFunction();
于 2013-05-17T17:54:32.723 に答える