7
votes

Abstract / Struct de base en C ++?

Je fais un jeu d'échecs et j'aimerais avoir une gamme de morceaux.

Si je suis correct, en Java, vous pouvez avoir une classe abstraite et avoir roi ou reine étendre cette classe. Si je devais créer un tableau de pièce S, je pourrais placer un king pièce quelque part dans ce tableau et un reine pièce à un autre endroit car les deux roi et reine étendre pièce .

Y a-t-il un moyen de le faire avec des structures en C ++?


4 commentaires

Les structures sont généralement destinées à C, C ++ vous confèrent des classes et du POO afin que je tiens à cela puisque vous êtes nouveau à C / C ++.


@ L7Colvinters: Pourquoi les structures ne sont-elles pas oop? Pourquoi devriez-vous utiliser des cours à la place?


@ L7Colwinters: C'est une déclaration étrange. struct et classe sont presque identiques.


Il y a une bonne discussion à leur sujet ici


6 Réponses :


4
votes

Vous pouvez simuler un Classe abstraite En C ++ en ajoutant une fonction virtuelle pure à une classe.

en C ++, vous pouvez tout faire avec des structures que vous pouvez sur les classes.
Une structure en C ++ ne diffère que d'une classe en termes de spécification d'accès par défaut pour les membres et pendant l'héritage.


0 commentaires

8
votes

oui. Vous pouvez créer un Classe de base abstraite en C ++. Il suffit de définir une ou plusieurs des méthodes pour être pur virtuel: xxx

Vous pouvez ensuite créer des sous-classes qui implémentent les méthodes virtuelles pure xxx / p>


0 commentaires

1
votes

Vous pouvez utiliser l'héritage en C ++ de la même manière que vous le faites en Java. C ++ a des classes et des structures, et dans ce cas, vous pouvez utiliser soit.

Les classes abstraites en C ++ ne sont que des cours avec des méthodes virtuelles pures en eux. Ce sont des méthodes sans définition de méthode. P>

Votre solution pourrait ressembler à ceci: P>

class Piece {
public:
   virtual ~Piece ();
   virtual void move() = 0; //this is a pure virtual function, making this an abstract class.
};

class King : public Piece {
public:
   void move() {};
};

class Queen : public Piece {
public:
  void move() {};
};

....

Piece *myPieces[2] = new Piece*[2];
myPieces[0] = new King();
myPieces[1] = new Queen(); 


8 commentaires

Ce n'est pas une syntaxe de classe C ++ valide. Vous ne préparez pas à accéder aux spécificateurs d'accès devant le mot-clé . Vous aurez également un problème d'épissage potentiel en attribuant K et Q aux mypieces comme ça.


Désolé, j'ai édité un peu le code. Qu'entendez-vous par problème d'épissage?


Merci. J'ai de nouveau édité le code. Espérons que cela semble mieux.


@Victort. Je pense que vous voulez dire tranchant, pas épissage


@Peterwood Oui c'est ce que je voulais dire, merci pour la correction: p


En fait, les méthodes virtuelles pures peuvent être définies , même si ce n'est pas le scénario le plus courant.


Il vous manque un destructeur virtuel.


MDR. Édité à nouveau. J'espère vraiment que c'est tout ce temps. : P J'ai oublié beaucoup plus C ++ que je pensais



3
votes

sûr.

array[index] = new King();


1 commentaires

Il vous manque un destructeur virtuel.



1
votes

en C ++ Vous pouvez utiliser des classes ou des structures abstraites: xxx

utilisation: xxx

sortie: xxx


2 commentaires

Ceci est une réponse incroyablement complexe à une question très simple! Avez-vous vraiment besoin d'introduire __ joli_function __ , boost, lambdas, algorithmes standard, etc.?


@Lucturaille Je suis habitué à utiliser __ joli_function __ car il affiche le nom de la classe et les types de paramètres / valeurs de retour. De cette façon, il est facile de voir ce qu'on appelle. En ce qui concerne le reste, je ne voulais pas vraiment passer plus de temps à une réponse simple, alors j'ai utilisé ce que je me suis venu à mon avis - bien sûr, je pouvais passer plus de temps à taper et à faire la réponse ....



1
votes

Je préfère éviter d'utiliser des pointeurs car vous devez vous rappeler de les nettoyer.

Cette conception utilise le modèle de stratégie. L'interface est par carte code>, ce qui vous permet d'afficher des positions valides sur une carte ou d'afficher les positions initiales sur la carte. Je suis sûr que vous voudrez plus que chaque stratégie puisse faire: p>

void add(vector<ChessMan>& chessmen,
         const ChessMan::Colour& colour,
         const PieceType& pieceType,
         const unsigned int amount)
{
    chessmen.insert(chessmen.end(), ChessMan(colour, pieceType), amount);
}

void main()
{
    using std::vector;

    vector<ChessMan> chessmen;
    add(chessmen, 16, ChessMan::Black, PAWN);
    add(chessmen, 2, ChessMan::Black, ROOK);
    add(chessmen, 2, ChessMan::Black, KNIGHT);
    //...
}


2 commentaires

La question concerne les classes de base abstraites, pas sur le meilleur design pour un jeu d'échecs. Même si votre réponse pourrait intéresser l'affiche originale, elle ne répond pas du tout à la question.


@LucTouraille Je pense qu'il est important d'utiliser des conteneurs pour des données homogènes. Le comportement hétérogène est mieux stocké ailleurs. J'ai donc mis les pointeurs à la classe abstraite à l'intérieur des objets homogènes. Je pense que c'est un bon principe. Je suis désolé si l'exemple était trop long, sinon je fournis une solution complète. Vous êtes libre de le modifier et de le rendre meilleur.