Domanda

Ho un interfaccia di funzione:

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

e l'idea è di recuperarlo come:

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

Tuttavia, occasionalmente faccio un errore e di scrittura:

Type type = iface.getType();

che copia per valore, che è quello che voglio evitare. Tuttavia quando faccio questi errori, il compilatore non emettere un avviso, perché la sua sintassi legale. Vorrei innescare un errore di compilazione per questo, Domanda Quali sono le mie alternative?

Ho pensato di dichiarare un costruttore di copia, ma non la definizione ovunque, causando un errore di collegamento in tempo se è usato, ma poi non sarà in grado di utilizzare costruttore di copia in situazione esistente, che è inferiore a auspicabile

È stato utile?

Soluzione

Fai iFace noncopyable mettendo il costruttore di copia e operatore di assegnamento in "privato". Quindi fornire un metodo esplicito copia.

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

È inoltre possibile utilizzare spinta noncopyable a fare lo stesso cosa (il suo implementato come sopra).

Quindi, se si voleva il codice da copiare, si farebbe

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

Per inciso -? Mi piacerebbe aggiungere che se si sta facendo questo a causa di problemi di prestazioni, sei certo che l'ottimizzatore non sbarazzarsi della copia temporanea per voi

Altri suggerimenti

Restituzione di un puntatore sembra ragionevole qui, ma se confondendo proprietà si preoccupa che si potrebbe tornare un wrapper di riferimento.

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

La classe originale può copiare come al solito, ma il riferimento si deve fare esplicitamente. Io non sono entusiasta dell'idea (vorrei pensare di meno di un utente che non si rese conto di come la semantica di copia di lavoro di uno che accidentalmente tenuto su uno di questi troppo lungo), ma in teoria è fattibile.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top