Question

J'ai une interface de fonction:

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

et l'idée est de récupérer comme:

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

Par contre, je fais de temps en temps je une erreur et écrire:

Type type = iface.getType();

qui copie en valeur, qui est ce que je veux éviter. Cependant, quand je fais ces erreurs, le compilateur ne délivre pas un avertissement parce que sa syntaxe juridique. Je voudrais déclencher une erreur de compilation pour cela, Question quelles sont mes alternatives?

Je pensais à déclarer un constructeur de copie mais ne définissant pas partout, ce qui provoque une erreur lien temps si elle est utilisée, mais je ne vais pas être en mesure d'utiliser constructeur de copie ANY situation, est inférieure à desiderable

Était-ce utile?

La solution

Faire iFace noncopyable en plaçant le constructeur de copie et opérateur d'affectation en « privé ». Indiquez ensuite une méthode explicite Copier.

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

Vous pouvez également utiliser boost noncopyable pour faire la même chose chose (son œuvre comme ci-dessus).

Donc, si vous vouliez que votre code à copier, vous feriez

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

En aparté - j'ajouter que si vous faites cela à cause de problèmes de performances, êtes-vous certain que l'optimiseur ne se débarrasse pas de la copie temporaire pour vous

Autres conseils

De retour d'un pointeur semble raisonnable, mais si la confusion la propriété vous inquiète vous pouvez retourner une enveloppe autour de la référence.

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

La classe d'origine peut copier normalement, mais la référence que vous avez à faire explicitement. Je ne suis pas enthousiaste à l'idée (je pense moins d'un utilisateur qui ne se rendent pas compte comment la sémantique de copie de travail que celui qui a tenu par mégarde sur un de ces trop long), mais il est théoriquement faisable.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top