引用类中的变量

时间:2013-06-22 10:34:19

标签: c++ reference const

基本上我想要一个常数 - 不是const参考 -
引用类中的变量。

class Foo
{
public:
    double x, y, z;
    double& a = x;
    double& b = y;
    double& c = z;
}

如果我设置x = 3,我希望a也是3 所以我想要一个x的引用 用double* a = &x;之类的指针很容易 但我不想每次都取消引用它..

如果我编译这个,我收到这条消息:

warning: non-static data member initializers only available with -std=c++11 or -std=gnu++11 [enabled by default]
warning: non-static data member initializers only available with -std=c++11 or -std=gnu++11 [enabled by default]
warning: non-static data member initializers only available with -std=c++11 or -std=gnu++11 [enabled by default]

但这不是主要问题: 如果我现在尝试使用它们(a, b, c),就像这里:

Foo foo;
foo.x = 1.0;
foo.y = 0.5;
foo.z = 5.1;
printf("a: <%f> b: <%f> c: <%f>\n", foo.a, foo.b, foo.c);

我得到了这个编译器消息:

foo.h:5 error: non-static reference member 'double& Foo::a', can't use default assignment operator
foo.h:6 error: non-static reference member 'double& Foo::b', can't use default assignment operator
foo.h:7 error: non-static reference member 'double& Foo::c', can't use default assignment operator

foo.h:5是double& a = x;
foo.h:6是double& b = y;
foo.h:7是double& c = z;

是什么是我的错误?

3 个答案:

答案 0 :(得分:5)

您无法通过分配初始化引用。它们需要在构造函数的初始化列表中初始化,如下所示:

class Foo
{
public:
    double x, y, z;
    double& a;
    double& b;
    double& c;
    Foo() : a(x), b(y), c(z) {}
    // You need an assignment operator and a copy constructor, too
    Foo(const Foo& rhs) : a(x), b(y), c(z), x(rhs.x), y(rhs.y), z(rhs.z) {}
    Foo& operator=(const Foo& rhs) { 
        x=rhs.x;
        y=rhs.y;
        z=rhs.z;
        return *this;
    }
};

答案 1 :(得分:0)

这里的问题实际上是你试图在类型的定义中分配一个引用。这不起作用,因为ax将根据放置Foo对象的位置而具有不同的位置。

您需要在创建Foo对象后执行此操作,这意味着在构造函数中

Foo():a(x),b(y),c(z){}

请注意,在构造之后尝试初始化引用也是无效的 - 它必须在构造函数中完成,而不是其他任何东西。

答案 2 :(得分:0)

由于您有参考成员,因此无法使用默认赋值运算符。它与初始化它们或初始化它们的方式无关。这是因为参考不能“重新安置”。

如果您发布导致问题的行,将会很有帮助。您必须拥有foo1=foo2;之类的内容。您的解决方案是编写自己的赋值运算符。