理解C ++中的指针和引用

时间:2010-11-12 21:33:25

标签: c++

有人会解释下面的代码吗?

A{}

C{public: begin(&a); private: A *a;}

begin(&a)
{
   a = &a;
}

B{private: A *a; C *c; start(); }

start(){
   c->begin(&a);
}

=>在B中,创建对象A,在C中,对象A以B中的对象a引用。

然后我遇到了这个问题:

  

没有用于调用的匹配函数:begin(a **),candidate:begin(& a)

否则,我可以在C#中编写它,我不知道如何在C ++中实现它:

public class A
{
   public A(){}
}

public class B
{
   A a;
   C c;
   public B()
   {
      c = new C();
   } 

   void start()
   {
       a = new A();
       c.begin(a);
   }
}

public class C
{
    A a;
    public C(){}

    public void begin(A a)
    {
      this.a = a;
    }
}

4 个答案:

答案 0 :(得分:2)

您是否只是想让语法正确?

class A
{};

class B
{
   std::auto_ptr<A> a;  // This object owns A so use a smart pointer to indicate ownership.
   C                c;

   B(B const&);           // Disable copying. If you want copying use boost::shared_ptr
   B& operator=(B const&);// Disable copying.

   public:   
     void start()
     {
       a.reset(new A());
       c.begin(a.get());
     }
};

class C
{
    A* a;
    public:
      C()
       : a(NULL)
      {}

    void begin(A* pA)
    {
      a = pA;
    }
};

答案 1 :(得分:1)

您正在传递a的地址并通过引用接收对象...这不是您想要的。您想传递真实对象,但通过引用接收它。如果a是指针,那么你传递指针的地址(因此**)。取消引用它并传递实际对象

答案 2 :(得分:1)

编译器会抱怨传递给函数C :: begin()的对象的类型。

据我所知,你将函数声明为一个以参考为参数的函数。

因此,通话应为c->begin(*a)而不是c->begin(&a)

答案 3 :(得分:0)

你误解了C ++引用的工作方式。如果你想传递一个方法的引用,你不需要在调用站点做任何事情 - 没有必要使用运算符的地址(&amp;)就像有一个指针。例如,请参阅这个使用引用的简单C ++程序:

#include <iostream>

void test (int& a) {
    a = 7;
}

int main (int argc, char** argv) {
    int q;
    test (q);
    std::cout << q << std::endl;
}

传递参考时没有任何特殊装饰。如果要将其分配给指针,则需要使用运算符的地址来获取引用的指针,如下所示:

#include <iostream>

int* ptr;

void test (int& a) {
    a = 7;
    ptr = &a;
}

int main (int argc, char** argv) {
    int q;
    test (q);
    std::cout << q << std::endl;
    std::cout << *ptr << std::endl;
}

在您的示例中,begin (&a)的定义是正确的,但其start中的调用网站不正确,应写为c->begin (*a)(您无法传递指针期望引用的方法,因此您需要取消引用第一个。)