Pregunta

Tengo una interfaz de función:

struct iFace {
  virtual Type& getType() = 0;
}

Y la idea es recuperarlo como:

iFace& iface = getIface();
Type& type = iface.getType();

Sin embargo, ocasionalmente hago un error y escribo:

Type type = iface.getType();

que copia por valor, que es lo que quiero evitar. Sin embargo, cuando cometo tales errores, el compilador no emite una advertencia porque es sintaxis legal. Me gustaría activar un error de tiempo de compilación para esto, Pregunta ¿Cuáles son mis alternativas?

Pensé en declarar un constructor de copias pero no definirlo en ningún lado, causando un error de tiempo de enlace si se usa, pero no podré usar el constructor de copias en NINGÚN situación, que es menos que desiderable

¿Fue útil?

Solución

Haga que IFACE no se pueda copiar colocando el constructor de copias y el operador de asignación en "privado". Luego proporcione un método de copia explícita.

class Type {
public:
  virtual Copy(Type& dest) = 0;
private:
  Type (const Type &) {assert(false)}
  Type & operator=(const Type &)  {assert(false)}
}

También puedes usar impulso no controlable hacer lo mismo (está implementado como el anterior).

Entonces, si quisiera que su código copiara, lo haría

Type& type = iface.getType();
Type typeCpy;
type.Copy(typeCpy);

Como aparte: agregaría que si está haciendo esto debido a las preocupaciones de rendimiento, ¿está seguro de que el optimizador no se deshace de la copia temporal para usted?

Otros consejos

Devolver un puntero parece razonable aquí, pero si confundir la propiedad le preocupa que pueda devolver un envoltorio alrededor de la referencia.

struct Class {
    struct Ref {
        Ref(Class& c_) : c(c_) { }
        Class Clone() { return c; }
        // overload -> to provide access to c
      private:
        Class& c;
    };
};

La clase original puede copiar como normal, pero la referencia que debe hacer explícitamente. No estoy entusiasmado con la idea (pensaría menos en un usuario que no se dio cuenta de cómo funciona la semántica que uno que accidentalmente se aferró a uno de estos demasiado tiempo) pero teóricamente es factible.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top