【问题标题】:Having trouble passing a pointer to a function, again再次将指针传递给函数时遇到问题
【发布时间】:2012-06-17 10:13:46
【问题描述】:

试图将我的二叉搜索树 (BST) 的根传递给 UI 函数(我需要将其作为可修改变量传递,或者无论如何调用它)

ma​​in.cpp

cmd = UI.uiCmd()

BST<Matrix> *data = new BST<Matrix>;
Matrix mat;

UI.handle (cmd, mat, data); // passing command, class object, root of BST

header 中的 UI 类有:

private:
void handle (int, Matrix, BST<Matrix *>);

.cpp 文件中:

void ui::handle(int cmd, Matrix matrix, BST<Matrix *> data)

我知道我在某个地方搞砸了,但我不能说在哪里,我对指针的把握很差

我得到的错误:它认为BST&lt;Matrix&gt;&amp;*,而函数要求BST&lt;Matrix&gt; *

我目前不打算过多使用 C++,因此不需要详细的回答(尽管表示赞赏)。

【问题讨论】:

    标签: c++ pointers parameter-passing


    【解决方案1】:

    你的函数签名应该看起来像

    void handle (int, Matrix, BST<Matrix>*)
    

    而不是

    void handle (int, Matrix, BST<Matrix *>)
    

    【讨论】:

      【解决方案2】:

      你已经创建了

          BST<Matrix> *data = new BST<Matrix>;
      

      但该函数要求BST&lt;Matrix*&gt; 参数。注意细微差别

          BST<Matrix> * IS NOT same as  BST<Matrix*>
      

      【讨论】:

      • 好的,我明白其中的区别。我想我应该知道这一点,但我发现指针完全令人困惑。谢谢
      【解决方案3】:

      首先BST&lt;Matrix *&gt;BST&lt;Matrix&gt;* 不同。一个是指针容器,另一个是指向容器的指针。

      其次,如果要让函数修改参数,可以通过引用传递:

      void ui::handle(int cmd, sMat matrix, BST<sMat>& data) 
      

      并像这样称呼它

      cmd = UI.uiCmd() 
      
      BST<Matrix> data;
      Matrix mat; 
      
      UI.handle(cmd, mat, data);
      

      【讨论】:

      • 如果我有声明BST&lt;sMat&gt;* data,然后是void ui::handle(int cmd, sMat matrix, BST&lt;sMat&gt;* data),它还会修改我的数据还是我必须使用&amp;,为什么?
      • 使用&amp; 意味着您不必传递指针。 &amp; 引用永远不能为空。因为你可以传递一个类的普通的基于堆栈的实例,你不需要使用new,也不需要担心以后使用deletestd::shared_ptr&lt;T&gt;或任何其他内存管理技术。如果您肯定要使用指针,则无需担心&amp; 引用。
      猜你喜欢
      • 2015-01-07
      • 1970-01-01
      • 1970-01-01
      • 2015-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多