2013-09-21 14 views
15
class A 
{ 
public: 
    A() = default; 
    A(const A&) = delete; 
}; 

class A 
{ 
public: 
    A() = default; 

private: 
    A(const A&) = delete; 
}; 

Queste due definizioni sono sempre identiche tra loro in ogni caso?Un costruttore eliminato deve essere privato?

+9

Rendo pubbliche le mie funzioni eliminate, perché è ** un annuncio ** per gli utenti pubblici che non può essere costruito come predefinito (nel tuo caso). – Nawaz

risposta

26

Sono diversi solo per la diagnostica prodotta. Se si rendono private, viene segnalato una violazione di accesso ulteriore e superfluo:

class A 
{ 
public: 
    A() = default; 
private: 
    A(const A&) = delete; 
}; 

int main() 
{ 
    A a; 
    A a2=a; 
} 

risultati nel seguente ulteriore uscita dal GCC 4.8:

main.cpp: In function 'int main()': 
main.cpp:6:5: error: 'A::A(const A&)' is private 
    A(const A&) = delete; 
    ^
main.cpp:12:10: error: within this context 
    A a2=a; 
     ^

metodi da qui la mia raccomandazione di rendere sempre cancellato public .

+5

+1. Rendo pubbliche le mie funzioni eliminate, perché è ** un annuncio ** per gli utenti pubblici che non può essere costruito come predefinito (nel caso dell'OP). – Nawaz

+3

@Nawaz Giusto, può quindi anche essere considerato parte dell'interfaccia/documentazione di classe. –

2

Desidero estendere Daniel Frey's answer. Invece di fare metodi cancellati semprepublic, preferirei dare a questi metodi il modificatore di accesso che tu (ipoteticamente) dare questi metodi se non sarebbero cancellati. (Non mi piace sempre nel caso in cui un programmatore ha un'opzione. Se sarebbe davvero essere intagliato nella pietra per rendere i metodi cancellati public, che dovrebbero essere applicate dal linguaggio stesso.)

alcune regole pratiche/linee guida :

  • copiare e spostare gli operatori di assegnazione saranno public in cemento e classi astratte maggior parte dei casi.
  • Copia e sposta i costruttori sarà public nelle classi di calcestruzzo per la maggior parte dei casi.
  • Copia e sposta i costruttori sarà protected nelle classi astratte per la maggior parte dei casi.
  • Copia e sposta i costruttori sarà private in calcestruzzo final classi che possono essere istanziate solo da friendsper la maggior parte dei casi.

In tutti i casi, si effettua un annuncio agli utenti appropriati di una classe anziché a tutti gli utenti di una classe.

Problemi correlati