2013-02-22 3 views
0

Следующий код является правильнымпутаница C++ ссылки в классе

string s1="abc"; 
    string s2="bcd"; 
    string &rs1=s1; 
    string &rs2=s2; 
    rs1=rs2; 
    cout<<rs1<<"----"<<rs2<<endl; 

И thefollowing код будет ошибка компиляции:

class A 
{ 
public: 
    A(string& a):ma(a) { } 

    string& ma; 
}; 

string s1="abc"; 
string s2="bcd"; 
A oa(s1); 
A ob(s2); 
oa=ob; 
cout<<oa.ma<<"----"<<ob.ma<<endl; 

Все вышеперечисленное является string& назначение типа, поэтому поставить их в класс вызовет ошибка компиляции? (GCC версии 4.7.1)

Информация об ошибке

non-static reference member 'std::string& A::ma', can't use default assignment operator 
+2

Я считаю, это потому, что строка передается в ctor (строка a) по значению, который является временным объектом, которому не разрешено инициализировать строку ref? –

+0

Я изменяю это, но он все еще имеет ошибку – zhenyuyang

+0

@zhenyuyang Пожалуйста, укажите * точный * текст ошибки в качестве дополнения к вашему вопросу; ** не ** здесь в комментарии. – WhozCraig

ответ

1

Вы задаете ссылку члена к локальной переменной темп. параметр в вашем конструкторе является темпом). Это вызывает «свисающую ссылку», что не очень хорошо.

Измените параметр на ссылку или измените свой член на ссылку без ссылки. Для ваших целей вы, вероятно, хотите:

class A 
{ 
public: 
    A(string& a):ma(a) { } 

    A& operator =(const A& other) 
    { 
     ma = other.ma; 
     return *this; 
    } 

    string& ma; 
}; 

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

UPDATE

Удельную стандарта дело с тем, почему оператор копирования назначение по умолчанию удаляется, если класс имеет опорный элемент:

C++11 § 12.8,p23

A defaulted copy/move assignment operator for class X is defined as deleted if X has: - a variant member with a non-trivial corresponding assignment operator and X is a union-like class, or

  • a non-static data member of const non-class type (or array thereof), or
  • a non-static data member of reference type, or
  • a non-static data member of class type M (or array thereof) that cannot be copied/moved because overload resolution (13.3), as applied to M’s corresponding assignment operator, results in an ambiguity or a function that is deleted or inaccessible from the defaulted assignment operator, or
  • a direct or virtual base class B that cannot be copied/moved because overload resolution (13.3), as applied to B’s corresponding assignment operator, results in an ambiguity or a function that is deleted or inaccessible from the defaulted assignment operator, or
  • for the move assignment operator, a non-static data member or direct base class with a type that does not have a move assignment operator and is not trivially copyable, or any direct or indirect virtual base class.
+0

Я меняю это, но он все еще имеет ошибку – zhenyuyang

+0

@zhenyuyang Я обновил его, включив переопределение присваивания, но, как я уже сказал, вам может не понравиться результат. (который будет 'bcd ---- bcd' кстати) – WhozCraig

+0

спасибо! Но почему оператор присваивания по умолчанию не генерируется, когда класс содержит ** ссылки **? – zhenyuyang

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