C++ - 方法实现取决于是否设置的成员引用变量

bom*_*bax 2 c++ pointers reference member

让我们说我想要的语义是

class Foo {
public:
    Foo(A &x);
    Foo(A &x, A &y);
    void method();
private:
    A &x, &y;
};
Foo::Foo(A &x) : x(x) {}
Foo::Foo(A &x, A &y) : x(x), y(y) {}
void Foo::method() {
    if (first_constructor_used) {

    } else {

    }
}
Run Code Online (Sandbox Code Playgroud)

现在很明显我无法检查成员变量xyNULL.添加类似check int变量的内容以查看运行的构造函数似乎很笨重而且不可扩展.有没有人对这里应该使用的语义有什么建议?

Rei*_*ica 7

这不起作用:Foo::Foo(A &x) : x(x) {}不会编译.你不能留下参考单位.

通常,不建议使用引用类型的数据成员.初始化后引用无法反弹,这意味着默认赋值运算符不起作用,并且很难实现自己的.

当然希望在接口中使用引用来表示"给我一个有效对象的引用,我不接受空值".但是,当存储在数据成员中时,通常最好将这些引用存储为指针.因此,我建议你实现这样的类:

class Foo {
public:
    Foo(A &x);
    Foo(A &x, A &y);
    void method();
private:
    A *x, *y;
};
Foo::Foo(A &x) : x(&x), y(nullptr) {}
Foo::Foo(A &x, A &y) : x(x), y(y) {}
void Foo::method() {
    if (!y) {

    } else {

    }
}
Run Code Online (Sandbox Code Playgroud)

这还有默认分配操作员再次开箱即用的额外奖励.