Según la experiencia, no utilice punteros simples, ya que puede olvidar fácilmente agregar los mecanismos de destrucción adecuados.
class Weight {
protected:
std::string name;
std::string desc;
public:
Weight (std::string n, std::string d)
: name(n), desc(d) {
std::cout << "W c-tor\n";
}
~Weight (void) {
std::cout << "W d-tor\n";
}
// disable them to prevent copying
// and generate error when compiling
Weight(const Weight&);
void operator=(const Weight&);
};
Entonces, para la clase que implementa el contenedor, utilice shared_ptr
o unique_ptr
a implementar el miembro de datos:
template <typename T>
class QList {
protected:
std::vector<std::shared_ptr<T>> v;
public:
QList (void) {
std::cout << "Q c-tor\n";
}
~QList (void) {
std::cout << "Q d-tor\n";
}
// disable them to prevent copying
QList(const QList&);
void operator=(const QList&);
void append(T& t) {
v.push_back(std::shared_ptr<T>(&t));
}
};
Su función para agregar un elemento haría uso o Devolvería la optimización del valor y no llamaría al constructor de copia (que no está definido):
QList<Weight> create (void) {
QList<Weight> ret;
Weight& weight = *(new Weight("cname", "Weight"));
ret.append(weight);
return ret;
}
Al añadir un elemento, el dejar que el contenedor de tomar la propiedad del objeto, por lo que no desasignar que:
QList<Weight> ql = create();
ql.append(*(new Weight("aname", "Height")));
// this generates segmentation fault because
// the object would be deallocated twice
Weight w("aname", "Height");
ql.append(w);
O, mejor, obligar al usuario a pasar su implementación QList punteros inteligentes: Sólo
void append(std::shared_ptr<T> t) {
v.push_back(t);
}
Y fuera de clase QList podrás usarlo como:
Weight * pw = new Weight("aname", "Height");
ql.append(std::shared_ptr<Weight>(pw));
Al usar shared_ptr también podría 'tomar' objetos de la colección, hacer copias, eliminarlos de la colección pero usarlos localmente, detrás de las escenas sería el único objeto único.
Ambas variantes se ven terriblemente mal (aunque solo la primera está realmente rota). –
Si se trata de 'QList' de la biblioteca' Qt', entonces tienen propiedades especiales de recuento de recuento de referencias que no son del todo típicas para la biblioteca estándar u otros tipos regulares. – woolstar