假设我想要的语义学是
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 {
}
}显然,我无法检查成员变量x和y是否为NULL。添加像check int变量这样的东西来查看哪个构造函数是运行的,这看起来很笨重,不可扩展。有人对这里应该使用的语义有什么建议吗?
发布于 2014-02-26 14:12:28
这是行不通的: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 {
}
}这将增加默认赋值运算符再次在框外工作的额外奖励。
发布于 2014-02-26 14:11:36
这是:
Foo::Foo(A &x) : x(x) {}是不合法的C++。必须立即初始化所有引用。您不能“忘记”或“忽略”初始化引用,因此您需要以某种方式重新设计类--也许是通过存储一个可以为空的指针。
https://stackoverflow.com/questions/22043748
复制相似问题