2013-02-22 11 views
5

Questa classe sta segnalando il seguente errore: 'const const non statico' const int Member :: membershipNo ', impossibile utilizzare l'operatore di assegnazione predefinito'. La cosa strana è che questo codice viene ripetuto in un altro progetto e funziona perfettamente. Puoi aiutarmi a rimediare?'Il membro const non statico non può usare l'operatore di assegnazione predefinito' - cosa significa?

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

risposta

7

Presumibilmente, da qualche parte nel codice si sta assegnando ad un Member, qualcosa di simile:

Member m1, m2; 
m1 = m2; 

Oppure lo si utilizza in un contesto che richiede il tipo di essere assegnabili.

Dato che non si fornisce il proprio sovraccarico dell'operatore di assegnazione per Member, l'operatore di assegnazione predefinito definito implicitamente di solito entrerebbe in funzione. Tuttavia, poiché si dispone di un membro dati const, il compilatore non ne definirà implicitamente uno. È necessario per fornire da soli.

Questo ha senso perché, immagina nell'esempio di codice che ho appena dato, cosa dovrebbe fare il compilatore per il membro m1membershipNo? Dovrebbe assegnare m2 allo membershipNo? Come può farlo se membershipNo è const? In questo caso, il compilatore dice semplicemente "No, non posso farlo".

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)
  • [...]

Come ho detto, per essere in grado di fare l'assegnazione con un Member, è necessario fornire un operatore di assegnazione del proprio:

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

Tuttavia, qui sta il problema di avere const membri. Se fornisci il tuo operatore di assegnazione copia come descritto, e tu non copia su membershipNo, hai davvero copiato l'altro oggetto? Logicamente, ha senso che un oggetto che ha uno stato constnon possa essere assegnato a.

E 'perfettamente bene di utilizzare un costruttore di copia però - è sufficiente per essere sicuri di inizializzare membershipNo nella lista di inizializzazione di membri:

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

E allora si può fare:

Member m1; 
Member m2 = m1; 
+0

Ah sì, grazie. Quindi non c'è modo di copiare usando un costruttore di copia un oggetto che ha dati const? – Armada

+0

@ Il costruttore di Frammo Copy sta perfettamente bene. L'assegnazione della copia non è - a meno che tu non ne fornisca la tua. –

+1

@Frammo ha spiegato di più! –

2

Quello che sta accadendo è che alcuni codice client sta tentando di utilizzare assegnare una Member esempio ad un altro. Dato che hai un membro di dati costante, questo non può funzionare. L'errore si presenta solo se alcuni codici tentano di eseguire l'assegnazione, motivo per cui può sembrare che la stessa classe "lavori" in un altro progetto.

In termini di messa a punto, le opzioni sono A) per non eseguire l'assegnazione, o B) rendere il membro dei dati non const.

+0

Ah si hai ragione. Grazie. Quindi non c'è modo di copiare/assegnare un'istanza che ha membri const?Perché fare una copia infrange le regole di modifica del valore dei dati const? – Armada

+1

@Frammo copia è OK. Assegnare non è. Quando si assegna LHS = RHS, LHS è già stato inizializzato e l'assegnazione implica un cambiamento nel suo stato. E se lo stato è const ... – juanchopanza

Problemi correlati