【问题标题】:Passing a Class Object to a function (probably by pointer not reference) C++将类对象传递给函数(可能通过指针而不是引用)C++
【发布时间】:2010-09-20 01:29:25
【问题描述】:

假设我有两个不同的功能。一个是 BST 类的一部分,一个只是将调用该类函数的辅助函数。我会在这里列出它们。

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

这个函数是这样调用的: sieve(t,n) 对象被称为 BST t;

我将在 sieve 函数中使用类 remove 函数来删除特定对象。我不确定这个基本功能的原型应该是什么样子?这样做:

sieve(BST<int> t, int n)

这里发生的一切都编译得很好,但是当调用 t.remove 函数时,我看不到实际结果。我假设是因为它只是创建一个副本或整个其他 t 对象,而不是从我的 main() 函数传递一个。

如果我在创建原始对象的主函数中调用删除函数 (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 对象传递给函数。

【问题讨论】:

  • 在您的第二个代码块中,您有两个

标签: c++ reference arguments


【解决方案1】:
sieve(BST<int>& t, int n)

&amp; 指定通过引用而不是值传递。 :-)

【讨论】:

    【解决方案2】:

    如果我正确理解您的问题,您应该使用

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

    并将其调用为:

    sieve(&t,n)
    

    将指针传递给t 对象

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

    并将其调用为:

    sieve(t,n)
    

    传递对t对象的引用

    【讨论】:

    • 我更喜欢这个答案。通过引用或指针传递完成同样的事情。唯一的区别是使用的间接级别。
    【解决方案3】:

    签名:

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

    实际上,将复制传递给sieve()BST&lt;int&gt;。因此,您对其所做的任何更改都将被丢弃(除非您返回它的副本)。

    你可能想要这样的东西:

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

    它传入一个引用,因此您在方法内对t 所做的任何修改都会对您传入的对象进行(而不是副本)。

    一旦理解并理解了它,您可能希望将 sieve() 函数设为“函数模板”,以便它可以采用包含任何类型的 BST&lt;&gt;

    【讨论】:

      【解决方案4】:

      这里发生的一切都编译得很好,但是当调用 t.remove 函数时,我看不到实际结果。我假设是因为它只是创建一个副本或整个其他 t 对象,而不是从我的 main() 函数传递一个。

      正确。这正是发生的情况,因为在 C++ 中,参数是按值传递给函数的。传递引用或指针将解决您的问题。使用引用更简洁。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-09-16
        • 2022-01-08
        • 2013-06-05
        • 1970-01-01
        • 2014-04-18
        • 2016-09-25
        • 2011-10-29
        • 2017-11-12
        相关资源
        最近更新 更多