我正在尝试将const
class B
引用对象传递给class A
的对象。这样,类A成员函数foo()可以访问bar()
的成员函数class B
。以下方法工作正常。
#include <iostream>
using namespace std;
class B {
public:
void bar() const { cout << "Bar"; }
};
class A {
public:
A (const B& _b) : b(_b) {}
void foo () { cout << "Foo"; b.bar(); }
private:
const B& b;
};
main()
{
B b1;
A a1(b1);
a1.foo();
}
但是,我没有在A的构造函数中传递b1
对象,而是在寻找一种在稍后阶段注册对象b1
的方法。下面提到的方法有错误,但有没有办法实现这个目标?
class A {
public:
A () {};
void registerB(const B& _b) { b =_b; } // Assignement not possible
void foo () { cout << "Foo "; b.bar(); }
private:
const B& b;
};
main()
{
B b1;
A a1;
// Do some work
a1.registerB(b1);
a1.foo();
}
修改
如果B对象不是const
,那么可以使它工作吗?
class A {
public:
A ():b(NULL) {};
void registerB(B& _b) { b =_b; } // Assignement not possible
void foo () { cout << "Foo "; b.bar(); }
private:
B& b; // Not const
};
答案 0 :(得分:1)
引用必须引用变量。与指针不同,它不能有表示空虚的值(如relationship
)。
因此,类A不能具有未在构造函数中指定的引用。在致电nullptr
之前a1.b
等于什么?
这样做的唯一方法是让A类有一个指向B类的指针。这样,构造a1.registerB(b1)
时它可以为null。
即
A
答案 1 :(得分:1)
另一种方法是为参考创建一个临时对象。
class A {
public:
A() : b{} {} // create temporary
void registerB(B& _b) { b = _b; } // Assign later
void foo () { std::cout << "Foo "; b.bar(); }
private:
B&& b;
};
注意:这会有警告:
临时绑定到'A :: b'只会持续存在,直到构造函数退出 [-Wextra]
因此,如果您忘记拨打registerB()
,这将导致未定义的行为。
查看更多Prolong life of a temporary object using const reference