2016-04-01 1 views
1

J'ai une classe PieceStrategy:Inclure la dépendance

#include "QueenStrategy.cpp" 
class PieceStrategy { 
    void promoteToQueen() { 
     this = new QueenStrategy(); 
    } 
} 

Et j'ai une classe QueenStrategy qui hérite de celui-ci:

#include "PieceStrategy.cpp" 
class QueenStrategy : public PieceStrategy {} 

se pose maintenant la circulaire comprend problème. Mais dans ce cas, je ne peux pas utiliser la déclaration forward.

Que dois-je faire?

+3

Vous ne devriez pas inclure des fichiers cpp (mise en œuvre). Pourquoi fais-tu ça? –

+3

Faire 'this = new ...' ne fonctionnera pas comme prévu. '* this = ...' pourrait fonctionner partiellement, mais cela ne fera pas de 'this' une instance de la nouvelle classe. –

+0

En ce qui concerne votre problème, ne définissez pas la fonction membre en ligne dans la classe, faites-le dans un fichier source à la place. Il n'est alors pas nécessaire d'inclure le fichier d'en-tête '' "QueenStrategy.h" 'dans le fichier d'en-tête' 'PieceStrategy.h" '. –

Répondre

4
  1. Vous ne devriez pas inclure des fichiers cpp, mais les en-têtes
  2. Vous ne devez pas attribuer à this
  3. Choisir une autre conception. Vous ne devriez pas essayer de modifier la stratégie mais en sélectionner une autre pour l'objet réel, qui utilise cette stratégie.

piece.hpp

#include "strategy.hpp" 
class Piece 
{ 
    std::unique_ptr<Strategy> strategy; 
public: 
    static Piece Pawn(); 
    void PromoteToQueen(); 
}; 

piece.cpp

#include "pawn.hpp" 
#include "queen.hpp" 

Piece Piece::Pawn() 
{ 
    Piece p; 
    p.strategy = std::make_unique<PawnStrategy>(); 
    return p; 
} 

void Piece::PromoteToQueen() 
{ 
    strategy = std::make_unique<QueenStrategy>(); 
}