1

では、2 つの異なる機能があるとします。1 つは BST クラスの一部で、もう 1 つはその Class 関数を呼び出す単なるヘルパー関数です。ここにそれらをリストします。

sieve(BST<T>* t, int n);

この関数は次のように呼び出されます: sieve(t,n) オブジェクトは BST t と呼ばれます。

特定のオブジェクトを削除するために、sieve 関数内でクラス削除関数を使用します。この基本機能のプロトタイプがどのように見えるべきかわかりませんか? これを行う:

sieve(BST<int> t, int n)

ここで何が起こるかというと、すべてが正常にコンパイルされますが、t.remove 関数が呼び出されると、実際の結果は表示されません。main() 関数からオブジェクトを渡すのではなく、コピーまたは他の t オブジェクト全体を作成しているだけなので、私は推測しています。

元のオブジェクトが作成されたメイン関数で削除関数 (t.remove(value)) を呼び出すと、すべてが適切に削除されます。ふるい機能を使用して開始すると、メイン機能から再印刷しても変化が見られません。したがって、私のメイン関数は次のようになります。

int main ()
{
   int n,
       i,
       len;

   BST<int> t;

   cin >> n;
   vector<int> v(n);

   srand(1);

   for (i = 0; i < n; i++)
      v[i] = rand() % n;

   for (i = 0; i < n; i++)
      t.insert(v[i]);
       print_stat(t);
   t.inOrder(print_data);



   sieve(v,t,n);
   print_stat(t);
   t.inOrder(print_data);
   return 0;
}

したがって、関数内のデバッグステートメントが実際に何かを削除していることを示していても、結果は同じになります。私が間違っているのは、関数に t オブジェクトを渡す方法だと思います。

4

4 に答える 4

3
sieve(BST<int>& t, int n)

は、値ではなく参照&渡しを指定します。:-)

于 2008-10-30T19:03:36.893 に答える
3

あなたの問題を正しく理解している場合は、使用する必要があります

BST t;    
sieve(BST<T> *t, int n);

そしてそれを次のように呼び出します:

sieve(&t,n)

tオブジェクトにポインタを渡す

また

BST t; 
sieve(BST<T> &t, int n);

そしてそれを次のように呼び出します:

sieve(t,n)

tオブジェクトへの参照を渡す

于 2008-10-30T19:06:40.743 に答える
2

署名:

/* missing return type */ sieve<BST<int> t, int n);

実際、BST<int>渡された toのコピーを作成しsieve()ます。そのため、それに加えた変更はすべて破棄されます (コピーを返さない限り)。

おそらく次のようなものが必要です。

void sieve<BST<int> & t, int n);

これは参照を渡すためt、メソッド内で行った変更は、渡したオブジェクトに対して行われます (コピーではありません)。

それを理解して理解したら、おそらくsieve()関数を「関数テンプレート」にして、BST<>任意の型を含むことができるようにすることをお勧めします。

于 2008-10-30T19:06:18.870 に答える
1

ここで何が起こるかというと、すべてが正常にコンパイルされますが、t.remove 関数が呼び出されると、実際の結果は表示されません。main() 関数からオブジェクトを渡すのではなく、コピーまたは他の t オブジェクト全体を作成しているだけなので、私は推測しています。

正しい。C++ では、パラメーターは値によって関数に渡されるため、まさにこれが起こります。参照またはポインターを渡すと、問題が解決します。参照を使用すると、よりクリーンになります。

于 2008-10-30T19:08:56.680 に答える