2013-06-22 7 views
2

В основном я хочу постоянную - а не const ссылку -
ссылка на переменную внутри класса.ссылка на переменную внутри класса

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

Если я устанавливаю x = 3 Я хочу a быть 3 слишком
, поэтому я хочу, чтобы быть ссылка на х было бы легко с указателем, как 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;

так что - моя ошибка?

ответ

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; 
    } 
}; 
+0

hmm now i get 'error: non-static member member 'double & Foo :: a', не может использовать оператор присваивания по умолчанию – bricklore

+0

@ Schnizel1337 Он отлично работает для меня ([ссылка на ideone] (http: // ideone.com/kkpdyF)). – dasblinkenlight

+0

Да, я видел, но попытаюсь установить 'foo' в другой экземпляр' Foo', тогда вы получите ошибки: см. Http: // ideone.com/5qJisq – bricklore

0

Проблема здесь действительно, что вы пытаетесь присвоить ссылку в определении типа. Это не сработает, так как a и x будут иметь разные местоположения в зависимости от того, где находится объект Foo.

Вы должны сделать это после того, как объект Foo был создан, что означает в конструктор

Foo(): а (х), Ь (у), с (г) {}

Обратите внимание, что он также был бы недопустимым, чтобы попытаться инициализировать ссылку после построения - это должно быть сделано в конструкторе и ничего больше.

0

Оператор присваивания по умолчанию не может использоваться, поскольку у вас есть ссылочные элементы. Это не имеет никакого отношения к тому, как вы их инициализируете или к чему вы их инициализируете. Это связано с тем, что ссылки не могут быть «переустановлены».

Было бы полезно, если бы вы разместили строку, которая вызывает проблему. У вас должно быть что-то вроде foo1=foo2;. Ваше решение состоит в том, чтобы написать свой собственный оператор присваивания.

Смежные вопросы