0

私はこのメッセージを持っているすべてのもので受け取っていますNode*(この宣言にはストレージまたはタイプ指定子がありません)。誰か助けてくれませんか、正しい方向に送ってください。

template <typename type>
Node* Stack<type>::pop() {
Node* retNode; // the node to be return
if(tos == NULL) {
    cerr << "*** Stack empty ***";
    exit(1);
}
else {
    retNode = tos; // store the location of tos
    tos = tos->getLink(); // move to new tos
    retNode->setLink(); // unlink the popped node from the stack
    size -= 1;
}
return retNode;
}

私はそれが扱っていると確信していますNode*が、私はただ何を理解することができません。

以下は、スタッククラスで使用されているノードクラスの宣言です。問題がわからないので、スタッククラスの宣言も必要かどうか教えてください。

template <typename type>
class Node<type>{

private:
type data;
Node *link;

public:
Node(type p_item, Node *p_link);
type getData() const;
Node* getLink() const;
void setData(type p_data);
void setLink(Node *node);
};
4

1 に答える 1

1

Nodeはクラス テンプレートであるため、データ型としてNodeorを使用することはできません。Node *山かっこでテンプレート引数を追加する必要があります (例: Node<int>orNode<char> *など)。

あなたが与えた特定の例では、次のことが適切だと思われます。

template <typename type>
Node<type>* Stack<type>::pop() {
  Node<type>* retNode;
  /* ... */
  return retNode;
}

つまり、 for に使用されるのと同じ型引数をStack(おそらく) forNodeにも使用する必要があります。

さらに 2 つの注意事項:

  1. Nodeテンプレートはスタックの内部データ構造を実装しているように見えますNode<type> *が、スタックの pop 関数によってポインターが返されるのは奇妙に思えます。typeオブジェクトを返す方がより自然に思えます (カプセル化が改善され、スタックのユーザーにとってより直感的になります) 。

  2. exitまた、スタックが空のときに pop 関数が呼び出される (したがって、プロセス全体が停止する)ことも奇妙に思えます。おそらくnullptr、またはダミー オブジェクトを返すか、例外をスローする (または同様の戦略) 方が適切でしょう。

于 2012-10-17T06:01:36.133 に答える