首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++ -方法实现取决于是否设置成员引用变量。

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

Stack Overflow用户
提问于 2014-02-26 14:04:13
回答 2查看 70关注 0票数 2

假设我想要的语义学是

代码语言:javascript
复制
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 {

    }
}

显然,我无法检查成员变量xy是否为NULL。添加像check int变量这样的东西来查看哪个构造函数是运行的,这看起来很笨重,不可扩展。有人对这里应该使用的语义有什么建议吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-02-26 14:12:28

这是行不通的:Foo::Foo(A &x) : x(x) {}不会编译。你不能把参考资料统一起来。

通常,不建议使用引用类型的数据成员。在初始化之后,引用不能反弹,这意味着默认的赋值操作符不工作,很难实现自己的操作。

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

代码语言:javascript
复制
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 {

    }
}

这将增加默认赋值运算符再次在框外工作的额外奖励。

票数 7
EN

Stack Overflow用户

发布于 2014-02-26 14:11:36

这是:

代码语言:javascript
复制
Foo::Foo(A &x) : x(x) {}

是不合法的C++。必须立即初始化所有引用。您不能“忘记”或“忽略”初始化引用,因此您需要以某种方式重新设计类--也许是通过存储一个可以为空的指针。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22043748

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档