Estoy tratando de pasar un vector de "Piece" (una clase que defino) por referencia a una función, sin embargo, durante el tiempo de compilación aparece un error que dice que "Piece" no está definido. Los archivos actualmente se ven así:

Header.hpp

#pragma once
#ifndef MY_CLASS_H // Will only be true the once!
#define MY_CLASS_H
#include <vector>
//some stuff    
bool make_move(std::vector<Piece*> & vector_of_pieces);
class Piece {
//member functions declarations
};
#endif

nonPieceFunctions.cpp

#include "Header.hpp"
#include<iostream>
#include <array>
#include <stdio.h>
#include <ctype.h>

using namespace std;

bool make_move(vector<Piece*> &vector_of_pieces) {
    string piece_location, piece_new_location;
    cout << "Which piece would you like to move?" << endl;
    while (is_valid_input(piece_location) == false) { //checks input is of the right format
        cin >> piece_location;
    }
    int file_no = get_file_no(piece_location); //gets file number from user input
    int rank_no = get_rank_no(piece_location); //gets rank number from user input
    cout << "File no is " << file_no << endl;
    cout << "Rank no is " << rank_no << endl;
    return true;
}

Esta no es la versión completa de la función que quiero hacer, pero actualmente no se compila como está. Ninguna función en "make_move" son funciones miembro de ninguna clase.

0
R L W 25 abr. 2017 a las 13:26

3 respuestas

La mejor respuesta

Tal y como está

bool make_move(std::vector<Piece*> & vector_of_pieces);

Viene antes de la definición de Piece, de ahí su problema.

Mueva esto después de la definición de clase.

O adelante declarar de la siguiente manera:

class Piece;
bool make_move(std::vector<Piece*> & vector_of_pieces);

Ya que está utilizando un puntero en el vector, debería funcionar.

Por cierto, ¿estás eliminando estos punteros en alguna parte?

3
doctorlove 25 abr. 2017 a las 10:32

Implemente la clase Piece antes de la desaceleración de make_move ():

#pragma once
#ifndef MY_CLASS_H // Will only be true the once!
#define MY_CLASS_H
#include <vector>
//some stuff 
class Piece {
//member functions declarations
};
bool make_move(std::vector<Piece*> & vector_of_pieces);

#endif

O use la desaceleración hacia adelante en la clase:

#pragma once
#ifndef MY_CLASS_H // Will only be true the once!
#define MY_CLASS_H
#include <vector>
//some stuff 
class Piece;   
bool make_move(std::vector<Piece*> & vector_of_pieces);
class Piece {
//member functions declarations
};
#endif
1
ofir agranat 25 abr. 2017 a las 10:36

Está utilizando Piece en la declaración de make_move, necesita decirle al compilador que seguirá más adelante:

class Piece;
bool make_move(std::vector<Piece*> & vector_of_pieces);

class Piece {
//member functions declarations
};
0
CompuChip 25 abr. 2017 a las 10:33