基本上我想要一个常数 - 不是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;
是什么是我的错误?
答案 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)
这里的问题实际上是你试图在类型的定义中分配一个引用。这不起作用,因为a
和x
将根据放置Foo
对象的位置而具有不同的位置。
您需要在创建Foo
对象后执行此操作,这意味着在构造函数中
Foo():a(x),b(y),c(z){}
请注意,在构造之后尝试初始化引用也是无效的 - 它必须在构造函数中完成,而不是其他任何东西。
答案 2 :(得分:0)
由于您有参考成员,因此无法使用默认赋值运算符。它与初始化它们或初始化它们的方式无关。这是因为参考不能“重新安置”。
如果您发布导致问题的行,将会很有帮助。您必须拥有foo1=foo2;
之类的内容。您的解决方案是编写自己的赋值运算符。