Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Ссылка


Автор: exceilence 30.12.2009, 19:18
Как можно сделать так чтобы в классе А была ссылка на некий класс X, Y, Z или ещё какой, если известно что он наследовал интерфейс класс iB        ?????????


Фигур вобщем конкретных много и все они наследовали интерфейс фигура             А теперь ячейка игральной доски должна присваивать ссылку кого-нибудь а кого не ясно!!!!!!!!!!      когото из списка разных объектов

Автор: mes 30.12.2009, 19:30
Цитата(exceilence @  30.12.2009,  18:18 Найти цитируемый пост)
Как можно сделать так чтобы в классе А была ссылка на некий класс X, Y, Z или ещё какой, если известно что он наследовал интерфейс класс iB        ?????????

ну так ссылку на iB и храните.. Правда доступен будет только интерфейс iB, a для получения интерфейса Х нужно приводить (dynamic_cast) или, что зачастую лучше, пользовать визетера.

Автор: exceilence 30.12.2009, 19:35
Есть ещё такая вещь как union       но в моём случае она не в тему наверное

Автор: mes 30.12.2009, 19:40
Цитата(exceilence @  30.12.2009,  18:35 Найти цитируемый пост)
Есть ещё такая вещь как union       но в моём случае она не в тему наверное 

абсолютно не в тему..
чем просто ссылка не устраивает то ?

Автор: exceilence 30.12.2009, 19:58
undefined reference to `vtable for

Добавлено через 8 минут и 40 секунд
class iFigure {
    public:
    virtual ~iFigure(){};
    virtual void move( Coordinates, Coordinates )=0;
};


нолик с равно дописал и таинственным образом ошибка пропала



зачем нолик??????

Автор: mes 30.12.2009, 20:46
показывает что у виртуальной  функции нет тела.. Ошибка линковки пропадет, но класс будет абстрактным и создать объект такого класса будет нельзя..
для подробностей читайте
Цитата

 про чисто виртуальные методы и абстрактные классы


Добавлено @ 20:47
гугль в помощь если не имеется под рукой хорошей книжки..

Автор: exceilence 30.12.2009, 21:25
virtual ~iFigure(){};

тильда зачем???

деструктор?

Добавлено через 1 минуту
ссылка на потомка работает если взять ссылку на интерфейс а потом ей присвоить имя потомка

так что норм

Автор: mes 30.12.2009, 21:40
Цитата(exceilence @  30.12.2009,  20:25 Найти цитируемый пост)
тильда зачем???

тильдой отличается деструктор от конструктора.

Добавлено через 1 минуту и 39 секунд
Цитата(exceilence @  30.12.2009,  20:25 Найти цитируемый пост)
ссылка на потомка работает если взять ссылку на интерфейс а потом ей присвоить имя потомка

если публичное наследование, то спокойно инициализируется ссылка на базовый объектом класса-наследника (без всяких доп. манипуляций)

Автор: exceilence 30.12.2009, 23:46
Высококачественный код... наваял за вечер.  Это шашки.  Каркас.  Вобщем выделение класса под конкретную фигуру надо было только для того чтобы проверить можно ли двигаться фигуре или нет олт точки А в точку Б 

фигура хорошо бы еслиб  смотрела только на относительное положение )))    Но как я понимаю придётся фигуре влезать в информацию доски и смотреть есть ли кто на пути   и  тогда уж принимать решение

Ну ладно

Все равно более менее логично ))

Код

#include <iostream>
using namespace std;

#define V_CELLS_COUNT 8
#define H_CELLS_COUNT 8
#define BLACK 0
#define WHITE 1

class Coordinates {
    public:
    int x;
    int y;
};

class iFigure {

    protected:
    string name;

    public:
    virtual ~iFigure(){};
    virtual bool move_abilities( Coordinates, Coordinates )=0;
    string get_name() {
        return this->name;
    }

};

class Draught : public iFigure {
    public:
    Draught() {
        this->name = "Draught";
    }

    bool move_abilities( Coordinates from, Coordinates to ) {
        cout << "Draught move" << endl;
        return true;
    }
};

class Queen : public iFigure {
    public:
    Queen() {
        this->name = "Queen";
    }

    bool move_abilities( Coordinates from, Coordinates to ) {
        cout << "Queen move" << endl;
        return true;
    }
};

class Cell : public Coordinates {
    public:
    int color;
    iFigure* figure;
};

class Board {

    private:
    Cell cells[V_CELLS_COUNT][H_CELLS_COUNT];


    void replace_figure( Coordinates from, Coordinates to ) {
        if( this->get_cell( from.y, from.x )->figure != NULL &&
            this->get_cell( to.y, to.x )->figure == NULL )
        {
            this->get_cell( to.y, to.x )->figure = this->get_cell( from.y, from.x )->figure;
            this->get_cell( from.y, from.x )->figure = NULL;
            cout << "Replaced: from  y " << from.y << " x "<< from.x << endl;
            cout << "Replaced: to    y " << to.y << " x "<< to.x << endl;
        }
    }


    Cell* get_cell( int y, int x ) {
        return &cells[ y ][ x ];
    }


    bool coordinates_is_correct ( Coordinates coord ) {
        if ( coord.x >= 0 && coord.x < H_CELLS_COUNT &&
             coord.y >= 0 && coord.y < V_CELLS_COUNT
           ){
            return true;
        } else {
            return false;
        }
    }


    public:

    Board() {
        int i,j;
        for ( i=0; i < V_CELLS_COUNT ; i++ ) {
            for ( j=0; j < H_CELLS_COUNT ; j++ ) {
                this->get_cell( i, j )->x = j;
                this->get_cell( i, j )->y = i;
                if ( (i+j)%2 == 0 ) {
                    this->get_cell( i, j )->color = BLACK;
                } else {
                    this->get_cell( i, j )->color = WHITE;
                }

            }
        }

        this->renew_start_positions();
    }


    void renew_start_positions() {
        int i,j;
        for ( i=0; i < V_CELLS_COUNT ; i++ ) {
            for ( j=0; j < H_CELLS_COUNT ; j++ ) {
                if ( i <  V_CELLS_COUNT/2-1 ) {
                    this->get_cell( i, j )->figure = new Queen();
                } else if ( i >  V_CELLS_COUNT/2 ) {
                    this->get_cell( i, j )->figure = new Draught();
                } else {
                    this->get_cell( i, j )->figure = NULL;
                }
            }
        }
    }


    bool move_figure( Coordinates from, Coordinates to ) {
        if(
            this->coordinates_is_correct( from ) &&
            this->coordinates_is_correct( to ) &&
            this->get_cell( from.y, from.x)->figure != NULL && 
            this->get_cell( from.y, from.x)->figure->move_abilities( from, to )
          )
        {
            replace_figure( from, to );
            return true;
        } else {
            return false;
        }
    }


    void print_all() {
        int i,j;
        for ( i=0; i < V_CELLS_COUNT ; i++ ) {
            for ( j=0; j < H_CELLS_COUNT ; j++ ) {
                cout << this->get_cell(i,j)->color << " [" << ((this->get_cell(i,j)->figure != NULL) ? this->get_cell(i,j)->figure->get_name() : "NULL") <<"] ";
            }
            cout << endl;
        }
    }

};

int main( void ) {

    Board *main_board = new Board();

    main_board -> print_all();

    main_board -> move_figure( (Coordinates){1,2}, (Coordinates){4,4} );

    main_board -> print_all();

    delete(main_board);

    return 0;
}



Добавлено через 4 минуты и 29 секунд
хорошо бы запаковать обход доски в паттерн Итератор

но мне нужны координаты... так что хз ... придётся везде так некрасиво эти два цикла гонять

Автор: mes 31.12.2009, 00:09
Цитата(exceilence @  30.12.2009,  22:46 Найти цитируемый пост)
фигура хорошо бы еслиб  смотрела только на относительное положение )))  

фигура не должна отвечать за коррекнтость хода. Она просто не может знать о всех правилах мира, в которых живет.
создайте отдельный класс (например Rules)  который будет отвечать за это, тогда сможете впоследствии легко на одной основе сделать несколько вариантов игр.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)