有人会解释下面的代码吗?
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;
}
}
答案 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)
(您无法传递指针期望引用的方法,因此您需要取消引用第一个。)