невозможно разделить классы заголовков.Я получаю "не называет тип" - PullRequest
0 голосов
/ 11 мая 2018

Я создал класс с заголовком, cpp и основным классом. При этом все хорошо! При разделении класса у меня будет 2 класса (header + CPP) и один основной класс A (Board) не распознает класс B (IllegalCoordinateException), даже если я вставил включение. Вероятно, это вопрос новичка, и я могу потерять некоторые очки, но я застрял в поиске своей проблемы.

Вот мой рабочий код (выделен только важные части):

main.cpp

#include "Board.h"

#include <iostream>
using namespace std;

int main() {


    Board board1{4};  // Initializes a 4x4 board

    try {
        board1[{3,4}]='O';   // This should raise an exception
    } catch (const IllegalCoordinateException& ex) {
        cout << "Illegal coordinate"  << ex.theCoordinate() << endl;  // prints "Illegal coordinate: 3,4"
    }


    return 0;
}

Board.h

#ifndef CIRC_H
#define CIRC_H

#include <iostream>
#include <string>
using namespace std;

struct coord {
    int x;
    int y;
};



class IllegalCoordinateException{
    coord _coord;
    public:
        IllegalCoordinateException(coord c){
            _coord = c;
        }
        string theCoordinate() const{
            return to_string(_coord.x)+","+to_string(_coord.y);
        }
};


class xo{
    char x;

    public:

        char getChar() const{return x;}

        char& operator= (const char c){x = c;}

        xo& operator= (const xo _xo){
            x = _xo.getChar();
            return *this;
        }
        void clear(){
            x = '.';
        }


        operator char() const{
            return x;
        }
};


class Board{

    private:

        coord _coord;
        xo** board;
        int size;

    public:
        Board();
        Board(int v);
        ~Board();
        xo& operator[](coord c); // here is where I use "IllegalCoordinateException"
};


#endif

Board.cpp

#include <iostream>
#include <vector>
#include "Board.h"
using namespace std;


void freeBoard(xo** board,int size){
    for(int i = 0 ; i < size ; i++){
        delete[] board[i];
    }
}

Board::Board()
{
    size = 0;
    board = new xo* [size];

}

Board::Board(int v)
{
    size = v;
    board = new xo* [size];

    for (int i=0; i<size; i++)
    {
        board[i] = new xo[size];
        for(int j = 0 ; j < size ; j++){
            board[i][j].clear();
        }
    }
}

Board::~Board(){
    freeBoard(board,size);
    delete[] board;
}


xo& Board::operator[](coord c)
{
    if(c.x < size && c.y < size)
    {
        return board[c.x][c.y];
    }
    else
    {
        throw IllegalCoordinateException(c);
    }
}

После отделения:

main.cpp Без различий

Board.h также cpp no ​​diff

#ifndef CIRC_H
#define CIRC_H

#include "IllegalCoordinateException.h"
#include <iostream>
#include <string>
using namespace std;



struct coord {
    int x;
    int y;
};



class xo{
    char x;

    public:

        char getChar() const{return x;}

        char& operator= (const char c){x = c;}

        xo& operator= (const xo _xo){
            x = _xo.getChar();
            return *this;
        }
        void clear(){
            x = '.';
        }


        operator char() const{
            return x;
        }
};



class Board{

    private:

        coord _coord;
        xo** board;
        int size;

    public:
        Board();
        Board(int v);
        ~Board();
        xo& operator[](coord c);
};


#endif

IllegalCoordinateException.h // Я также разделил в своем коде на .h и .cpp (но, разумеется, нет реальной разницы.

#ifndef CIRC_H
#define CIRC_H

#include <iostream>
#include "Board.h"
using namespace std;

class IllegalCoordinateException{
    coord _coord;
    public:
        IllegalCoordinateException(coord c){ _coord = c;}
        string theCoordinate() const{return to_string(_coord.x)+","+to_string(_coord.y);}
};
#endif

При выполнении

$ g++ -g -Og -std=c++0x main.cpp Board.cpp IllegalCoordinateException.cpp

Я получаю:

Board.cpp: в функции-члене «xo & Board :: operator»: Board.cpp: 60: 43: ошибка: «IllegalCoordinateException» не было объявлено в этом объеме throw IllegalCoordinateException (c);

Как это может быть? Я имею в виду, что включаю его в Board.h, поэтому Board.cpp должен его распознать !? Я также попытался включить его в Board.cpp, а также сделать предварительное заявление в Board.cpp, но оба они были скромными.

1 Ответ

0 голосов
/ 11 мая 2018

Оба ваших заголовочных файла имеют #ifndef CIRC_H / #define CIRC_H.

Таким образом, когда первый включен (независимо от того, какой порядок), он определяет CIRC_H, и когда второй включен, он игнорируется, потому что весь файл находится в пределах #ifndef CIRC_H.

Решение: используйте разные имена макросов для каждого заголовочного файла.

...