c++ boost noncopyable

c++ - ¿Por qué boost:: noncopyable requiere herencia



(5)

Agregar cualquier miembro no copiable a una clase evitaría la generación automática de la construcción de copias y el operador de asignación. ¿Por qué el impulso requiere herencia para usar no copiable?

Creo que no estoy solo en mi preferencia estilística por

class MyUtility : public MyBase { noncopyable guard; ... };

Opuesto a

class MyUtility : public MyBase , private noncopyable { ... };

Dave Abrahams es un tipo inteligente, por lo que probablemente consideró esta posibilidad. ¿Qué me estoy perdiendo? ¿Qué logra la herencia?


La razón más obvia es que la clase derivada "isA" no es compilable, por lo que usar la herencia tiene más sentido. El hecho de que usarlo de esta manera no aumente el tamaño de la clase también es una consideración hoy en día (pero creo que el noncopiable precedió a la optimización de la clase base vacía).


Personalmente, prefiero la sintaxis de impulso. La herencia es una forma de agregar algunas propiedades o características a toda la clase, y no se puede copiar esta característica. El miembro no copiable parece complicado (en realidad no desea agregar ningún miembro, es un truco). La herencia se usa precisamente para lo que está diseñado.


Porque sizeof(boost::noncopyable)!=0 . Entonces, en este caso, el tamaño de tu clase será más grande.

Here puede leer sobre la optimización de la base vacía. (Consulte la sección "4.7: La optimización de miembros vacíos").

Editar: El hecho de que noncopyable no tenga constructores públicos lo hace inútil para cualquier otro uso, mientras que las clases con constructor público también pueden ser utilizadas para otros fines erróneos. Esta es otra razón, por qué impulsar elegir este enfoque.


Si omite la designación private , se vuelve casi como inglés:

// English: this is my car, it is not copyable class MyCar: noncopyable {}; // my truck is noncopyable, did i mention it''s also a vehicle? class MyTruck: noncopyable, public MyVehicle {}; // My airplane is a vehicle, BTW it''s not copyable class MyAirplane: public MyVehicle, noncopyable {};


Si pudieras usar noncopyable como miembro, requeriría un constructor y un destructor públicos predeterminados. Entonces las personas podrían crear instancias de no noncopyable o incluso usarlo como una clase base polimórfica sin que el destructor sea virtual. La implementación sin miembros públicos simplemente asegura que se use únicamente como una clase de política.