2013-02-22 4 views
5

Ta klasa zgłasza następujący błąd: "niestatyczny element const" const int Członek :: memberNo ", nie można użyć domyślnego operatora przypisania". Dziwne jest to, że ten kod powtarza się w innym projekcie i działa doskonale. Czy możesz mi pomóc to naprawić?"Typ niestatyczny element stały nie może używać domyślnego operatora przypisania" - co to oznacza?

Member.h

class Member : public Person 
    { 
    public: 
     Member(); 
     Member(int membershipNo); 
     virtual ~Member(); 

     int getMembershipNo() const; 

    private: 
     const int membershipNo; 

     friend class boost::serialization::access; 
     template<class Archive> 
     void serialize(Archive& ar, const unsigned int version) 
     { 
      ar & boost::serialization::base_object<Person>(*this); 
      ar & membershipNo; 
     } 

    }; 

Member.cpp

Member::Member() : membershipNo(0) 
{ 
    Person(); 
} 

Member::Member(int memberNo) : membershipNo(memberNo) 
{ 
    Person(); 
} 

Member::~Member() 
{ 
    // TODO Auto-generated destructor stub 
} 

int Member::getMembershipNo() const 
{ 
    return membershipNo; 
} 

Odpowiedz

7

Można przypuszczać, że gdzieś w kodzie jesteś przypisywanie do Member, coś takiego:

Member m1, m2; 
m1 = m2; 

Albo używasz go w kontekście, który wymaga typ być przypisane.

Ponieważ nie dostarczyć własne przeciążenie operatora przypisania dla Member, niejawnie zdefiniowane defaulted operator przypisania zazwyczaj kopać. Jednak, ponieważ masz członek const danych, kompilator nie będzie pośrednio określić jeden dla Ciebie. Musisz potrzebujesz, aby zapewnić to samemu.

Ma to sens, ponieważ wyobrażamy sobie w kodzie przykładowym, który właśnie podałem, co powinien zrobić kompilator dla członka'membershipNo? Czy powinno mu się przydzielić m2 's membershipNo? Jak to zrobić, jeśli membershipNo jest const? W tym przypadku kompilator po prostu mówi "Nie, nie mogę tego zrobić".

A defaulted copy/move assignment operator for class X is defined as deleted if X has:

  • a non-static data member of const non-class type (or array thereof)
  • [...]

Jak powiedziałem, aby móc wykonać zadanie z Member, trzeba dostarczyć operator przypisania własny:

Member& Member::operator=(const Member& other) 
{ 
    // Copy things from other to this 
} 

Jednak tu leży problem z posiadaniem const członków. Jeśli podasz swój własny operator przypisania kopii, jak opisano, a ty nie będziesz kopiować nad membershipNo, to czy naprawdę skopiowałeś drugi obiekt? Logicznie rzecz biorąc, ma sens, że obiekt, który ma dowolny stan, nie powinien być w stanie być przypisany.

Jest perfekcyjnie wykorzystać konstruktor kopiujący jednak - trzeba tylko, aby upewnić się zainicjować membershipNo na liście inicjalizacji użytkownik:

Member::Member(const Member& other) 
    : membershipNo(other.membershipNo) 
{ 
    // ... 
} 

A potem można zrobić:

Member m1; 
Member m2 = m1; 
+0

Ah tak, dziękuję. Więc nie ma sposobu na kopiowanie za pomocą konstruktora kopii obiektu, który ma dane const? – Armada

+0

Konstruktor @Frammo Copy jest całkowicie w porządku. Kopiuj zadanie nie jest - chyba że podasz własne. –

+1

@Frammo wyjaśnił więcej! –

2

Co się dzieje jest to, że niektóre kod klienta próbuje użyć przypisać jedną Member wystąpienie na inny. Ponieważ masz stałego członka danych, to nie może działać. Błąd pojawi się tylko wtedy, gdy jakiś kod podejmie próbę przypisania, dlatego może się wydawać, że ta sama klasa "działa" w innym projekcie.

Pod względem prawidłowego wykonania, opcje są następujące: A) nieprzeprowadzanie przypisania lub B) nieużywanie elementu danych.

+0

Ah tak masz rację. Dziękuję Ci. Więc nie ma sposobu, aby skopiować/przypisać instancję, która ma członków const?Dlaczego zrobienie kopii złamałoby zasady zmiany wartości danych stałych? – Armada

+1

@Frammo kopiowanie jest OK. Przypisywanie nie jest. Kiedy przypisujesz LHS = RHS, LHS został już zainicjowany, a przypisanie implikuje zmianę jego stanu. A jeśli państwo jest stałe ... – juanchopanza