Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ссылка 
:(
    Опции темы
exceilence
Дата 30.12.2009, 19:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 22.6.2009
Где: Москва

Репутация: нет
Всего: нет



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


Фигур вобщем конкретных много и все они наследовали интерфейс фигура             А теперь ячейка игральной доски должна присваивать ссылку кого-нибудь а кого не ясно!!!!!!!!!!      когото из списка разных объектов
PM MAIL   Вверх
mes
Дата 30.12.2009, 19:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



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

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



--------------------
PM MAIL WWW   Вверх
exceilence
Дата 30.12.2009, 19:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 22.6.2009
Где: Москва

Репутация: нет
Всего: нет



Есть ещё такая вещь как union       но в моём случае она не в тему наверное
PM MAIL   Вверх
mes
Дата 30.12.2009, 19:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



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

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



--------------------
PM MAIL WWW   Вверх
exceilence
Дата 30.12.2009, 19:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 22.6.2009
Где: Москва

Репутация: нет
Всего: нет



undefined reference to `vtable for

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


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



зачем нолик??????
PM MAIL   Вверх
mes
Дата 30.12.2009, 20:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



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

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


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


Это сообщение отредактировал(а) mes - 30.12.2009, 20:47


--------------------
PM MAIL WWW   Вверх
exceilence
Дата 30.12.2009, 21:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 22.6.2009
Где: Москва

Репутация: нет
Всего: нет



virtual ~iFigure(){};

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

деструктор?

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

так что норм
PM MAIL   Вверх
mes
Дата 30.12.2009, 21:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



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

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

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

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



--------------------
PM MAIL WWW   Вверх
exceilence
Дата 30.12.2009, 23:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 22.6.2009
Где: Москва

Репутация: нет
Всего: нет



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

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

Ну ладно

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

Код

#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 секунд
хорошо бы запаковать обход доски в паттерн Итератор

но мне нужны координаты... так что хз ... придётся везде так некрасиво эти два цикла гонять
PM MAIL   Вверх
mes
Дата 31.12.2009, 00:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



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

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



--------------------
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0566 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.