将const类型引用对象注册为C ++类成员对象

时间:2018-04-24 04:13:39

标签: c++ const pass-by-reference

我正在尝试将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
};

2 个答案:

答案 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

相关问题