2013-04-09 2 views
0

(en supposant que je ne peux pas utiliser boost::noncopyable, qui a été explicitement prévu à cet effet)Quelle est la meilleure syntaxe pour déclarer une classe comme non recouvrable?

(en supposant que je ne peux pas utiliser C++ 11)

Lorsque vous faites une classe noncopyable, je vois habituellement la syntaxe suivante:

class MyClass 
{ 
public: 
    ... 
    stuff 
    ... 

private: 
    MyClass(const MyClass&); // disables the copy constructor 
    MyClass& operator=(const MyClass&); // disables the copy assignment operator 
}; 

Cette syntaxe semble longue. Je pense que je peux utiliser ce qui suit à la place:

MyClass(MyClass&); // disables the copy constructor 
    void operator=(MyClass); // disables the copy assignment operator 

Cela semble plus court (il répète le nom de la classe seulement 3 fois au lieu de 4 fois, il omet également const et &).

Est-ce que ma syntaxe fait exactement la même chose que l'autre syntaxe?

Y a-t-il une raison de préférer l'un à l'autre?

Répondre

0

Mettre l'accent sur le raccourcissement du code source de quelques mots n'est pas très bon. En outre, vous rendez votre operator= illisible, il n'y a plus d'opérateur de copie ...
Vous devriez vous abstenir d'utiliser ce dernier simplement pour sauvegarder quelques mots.

Si vous êtes un programmeur C++ qui a lu un texte d'introduction sur C++, mais a peu d'exposition à idiomatiques C++ (c.-à-Il y a un poste here, indiquant

// QUOTE

class MyClass 
{ 
private: 
    MyClass(const MyClass&) {} 
    MyClass& operator=(const MyClass&) {} 
}; 

: beaucoup de programmeurs C++), c'est ... confus. Il déclare les constructeurs de copie et les opérateurs d'affectation de copie, mais ils sont vides. Alors pourquoi les déclarer? Oui, ils sont privés, mais cela ne fait que soulever plus de questions: pourquoi les rendre privés?

Pour comprendre pourquoi cela empêche la copie, vous devez réaliser qu'en les déclarant privés, vous faites en sorte que les non-membres/amis ne puissent pas le copier. Ce n'est pas immédiatement évident pour le novice. Le message d'erreur qu'ils obtiendront quand ils essaient de le copier n'est pas non plus.

// QUOTE END

Questions connexes