2
votes

Impossible d'utiliser la liste entre accolades dans le constructeur - C ++

J'essaye de créer un jeu de tic tac toe en C ++. J'essaie d'utiliser un tableau 2d char pour construire la carte, mais lorsque mon code ci-dessous va être compilé, j'obtiens une erreur error: can't convert '' à 'char' dans l'affectation

Voici le code:

. . .
. . .
. . .

Si j'ajoute le bloc suivant à main (et ajustez d'autres choses):

char grid[3][3] = { {'.', '.', '.'},
                    {'.', '.', '.'},
                    {'.', '.', '.'}};

for (int i =0; i < 3; i ++){
    for (int j =0; j < 3; j++){
        cout << grid[i][j] << " ";
    } //end inner j for
    cout << endl;
} // end outer i for 

J'obtiens le résultat attendu de:

#include <iostream>
#include <string>
#include <cstdlib>

using namespace std;

// Player Class
class Player
{
    public:
    explicit Player(string name){
        this->name = name;
    }

    string getName(){
        return name;
    }

    string setName(string newname){
        name = newname;
    }

    int generateRowMovement(){
        int row = rand() % 2; // Random number between 0 and 2
        return row;
    }

    int generateColMovement(){
        int col = rand() % 2; // Random number between 0 and 2
        return col;
    }

    int placeMove(){
        int rowMove, colMove;
        rowMove = rand() % 2;
        colMove = rand() % 2;
        return rowMove, colMove;

    }

    private:
    string name;

};

//Board Class
class Board
{
    public:
    explicit Board(){
    this->state[3][3] = {
                        {'.', '.', '.'},
                        {'.', '.', '.'},
                        {'.', '.', '.'}}
    } // end board

    void printBoard(char state[3][3]){
        for (int i =0; i < 3; i ++){
            for (int j =0; j < 3; j++){
                cout << state[i][j] << " ";
            }
            cout << endl;
        }
    } //end printboard

    void printBoard(){
        for (int i =0; i < 3; i ++){
            for (int j =0; j < 3; j++){
                cout << this->state[i][j] << " ";
            } //end inner j for
            cout << endl;
        } // end outer i for        
    } //end printboard

    private:
    char state[3][3];

};

int main(){
    // Player Tony("Tony");
    // cout << Tony.getName();

    Player Tony("Tony");
    Board game();

    cout << Tony.getName() << endl;
    Tony.setName("Bob");
    cout << Tony.getName() << endl;
    int currRow, currCol;
    currRow = Tony.generateRowMovement();
    currCol = Tony.generateColMovement();
    cout << currRow << currCol << endl;



    return 0;

} //end main

Pourquoi ne puis-je pas définir la valeur par défaut construction de cet objet un tableau [3] [3] char comme ci-dessus?


5 commentaires

Votre constructeur de carte doit utiliser des boucles pour remplir l'état membre . Pouvez-vous donner un exemple? Si vous ne pouvez pas le dire, je suis assez nouveau en C ++. Je ne sais pas comment faire.


N'utilisez pas rand en C ++. Il est officiellement connu comme un RNG de basse qualité. Utilisez plutôt std :: uniform_int_distribution . Essayez également d'éviter d'utiliser l'espace de noms std; car cela est considéré comme une mauvaise pratique et causera de sérieux problèmes. Voir Pourquoi "using namespace std;" considéré comme une mauvaise pratique?


Vous avez un deuxième problème dans votre code: je ne pense pas que votre fonction Player :: placeMove fasse ce que vous pensez qu'elle fait. Il semble que vous vouliez renvoyer une paire ligne, col , mais ce n'est pas ce qui se passe là-bas. Voir ici pour plus d'informations sur l'opérateur virgule: stackoverflow.com/questions/52550/… ou fr. cppreference.com/w/cpp/language/... (les deux disent la même chose, juste dans des styles différents).


Si vous voulez renvoyer une ligne, une paire de col, alors changez pour fonctionner comme ceci: pair placeMove () {... return make_pair (rowMove, colMove); } , puis utilisez-le comme ceci: auto b = Tony.placeMove (); cout << b.first << "," << b.second << endl; . Je pense que cela vous donnera ce que vous recherchez.


Je me posais la question. Comment pourrais-je utiliser cette paire pour placer un marqueur, disons «X», sur le tableau char [3] [3] ?


3 Réponses :


2
votes

L'initialisation d'accolades de tableau ne fonctionne que lors de la déclaration d'un tableau.

Si vous utilisez C ++ 1x, essayez d'ajouter l'instruction d'initialisation {...} à la déclaration de membre:

std::fill  (&state[0][0], &state[3][3],                      '.');
std::fill_n(&state[0][0], sizeof(state)/sizeof(state[0][0]), '.');

Vous pouvez également remplir le tableau en utilisant std :: fill ou std::fill_n:

private:
char state[3][3] = {...};


2 commentaires

De cette façon, je ne pourrais jamais modifier la valeur, non, car elle est privée?


@JerryM. Il est déjà privé dans votre code. Privé signifie qu'il n'est pas accessible en dehors de la classe, mais qu'il peut être accédé par des méthodes de classe (comme vous le faites)



1
votes

this-> state [3] [3] = {...} n'est pas une affectation valide. Vous ne pouvez pas attribuer de tableaux de cette façon. Et l'initialisation d'accolades ne fonctionne que dans une déclaration, pas dans une affectation. Votre constructeur de Board doit utiliser des boucles pour remplir le membre state :

explicit Board(){
    for (int i =0; i < 3; i ++){
        for (int j =0; j < 3; j++){
            state[i][j] = '.';
        }
    }
}


1 commentaires

state [i] [j] << '.' ou state [i] [j] == '.' ?



0
votes

Pourquoi ne puis-je pas faire de la construction par défaut de cet objet un [3] [3] tableau de caractères comme ci-dessus?

Oui, vous pouvez.

explicit Board() : state({
                        {'.', '.', '.'},
                        {'.', '.', '.'},
                        {'.', '.', '.'}}) {
} // end board

this-> state [3] [3] = est une instruction d'affectation de variable, vous ne pouvez pas utiliser d'accolade liste jointe. Mais vous pouvez l'utiliser dans le constructeur.


0 commentaires