0

そのような関数をどのように実装するのか興味があります。例えば、

私は次のようなものを持っています:

class Node {
public:
int dataItem;
Node *next;
};

void foo(int number, Node & n) {
// do something
}

次に、主にその関数を呼び出す必要がありますが、このようなものは機能しません。

int main () {
Node *n;
int data;
foo(data, n);
return 0;
}

mainで参照によってノードを渡すためにラッパー関数が必要になりますが、これは私が苦労している場所です。問題へのアプローチ方法がわかりません。私はいくつかのアイデアを試しました、私はオンラインでたくさん読んだことがあります、しかし私はそれを理解していません。このラッパー関数を実装する方法を理解するのに役立つ情報は素晴らしいでしょう。

4

2 に答える 2

4

あなたはまったく持っていませんNodeNodeあなたはまだ特定の場所を指していないポインタを持っているだけです(あなたdataも初期化されていません)。タイプの参照パラメーターでは、ではなく、Node&を渡す必要があるため、実際に必要なのは次のとおりです。NodeNode*

int main() {
  Node n;
  int data = 0;
  foo(data, n); // Pass the Node directly
  return 0;
}

または、本当にnポインタである必要がある場合は、次のようにすることができます。

int main() {
  Node* n = new Node();
  int data = 0;
  foo(data, *n); // Dereference n to get the Node it points to
  delete n;
  return 0;
}

ただし、この状況でrawポインタを使用することはお勧めしませんdelete。メモリリークを回避することを忘れないでください。std::unique_ptr<Node> n(new Node())代わりにを使用することもできますが、(最初の例のように)自動保存期間付きを使用することをお勧めしますNode* n = new Node()Node

于 2012-12-01T18:03:51.767 に答える
1

関数fooはへの参照を取りNodeますが、ポインターを渡しています。main()たとえば、関数またはのコードを変更します

int main () {
Node n;
int data; // beware, may contain garbage value.
foo(data, n);
return 0;
}

また

void foo(int number, Node* n) {
// do something
}
于 2012-12-01T18:04:50.827 に答える