Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.95/20: Рейтинг темы: голосов - 20, средняя оценка - 4.95
Автор FAQ
3687 / 964 / 114
Регистрация: 10.01.2010
Сообщений: 2,550
1

Конструктор ссылки?

03.02.2010, 22:10. Показов 3644. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
StateManager.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class StateManager{
public:
    typedef long state_type;
    typedef void (*executor)(int);
 
    StateManager::StateManager(state_type mainState, executor newExec);
private:
    executor exec;
    struct state_unit{
        state_type func;
        state_unit* parent;
        state_unit(state_type newState, state_unit* newParent = NULL);
    };
    state_unit* cur_state;
 
    void Push(state_type newState, bool execute = true);
}
StateManager.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
StateManager::state_unit::state_unit(StateManager::state_type newFunc, StateManager::state_unit* newParent)
: func(newFunc), parent(newParent)
{           }
 
StateManager::StateManager(state_type mainFunc, executor newExec)
: exec(newExec)
{
    cur_state->func = mainFunc;
}
 
void StateManager::Push(state_type newState, bool execute){
    state_unit* new_state = new state_unit(newState);
    new_state->parent = cur_state;
    cur_state = new_state;
    if ( execute == true )
    {
        exec(cur_state->func);
    }
}
C++
1
: func(newFunc), parent(newParent)
Ошибка:
error C2533: StateManager::state_unit::{ctor}: конструкторы не разрешены для возвращаемого типа
Странно, я просто хочу скопировать ссылку. parent ссылка, newParent тоже ссылка... или так нельзя?

C++
1
    state_unit* new_state = new state_unit(newState);
Ошибка:
error C2264: StateManager::state_unit::state_unit: ошибка в определении или объявлении функции; функция не вызвана
Может из за предыдущей ошибки?...
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.02.2010, 22:10
Ответы с готовыми решениями:

Поле ссылки через конструктор
Хочу опрокидывая ссылку в конструктор, чтобы она заносилась в поле ссылки. Вроде все логично но НЕ...

Не могу сделать чтобы класс содержал основной конструктор и конструктор копирования
Разработать класс ThreeAngle для работы с плоскими треугольниками. В качестве членов-данных...

Конструктор класса, конструктор копирования запускается не тот который нужен
Есть такой конструктор: Neuron::Neuron(int iType_activation_funk) { this->iType_act =...

this(Всегда ли вызывается конструктор при не явной передачи объекта в конструктор)
class Test { int i; public: void test(int i) { this -> i = i; } }; Конструктор...

8
Evg
Эксперт CАвтор FAQ
21280 / 8302 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
03.02.2010, 22:35 2
Напиши ещё, к какой строке ошибка привязана

Потом структура state_unit имеет конструктор с двумя параметрами, но конструктор класса StateManager, сожержащего экземпляр типа state_unit, не имеет внутри себя вызов конструктора state_unit
0
Автор FAQ
3687 / 964 / 114
Регистрация: 10.01.2010
Сообщений: 2,550
04.02.2010, 16:21  [ТС] 3
Переписал .cpp так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
StateManager::StateManager(state_type mainFunc, executor newExec)
: exec(newExec)
{
    cur_state = new state_unit(mainFunc);
}
 
StateManager::state_unit::state_unit(StateManager::state_type newFunc, StateManager::state_unit* newParent)
: func(newFunc),
parent(newParent)
{           }
 
 
 
void StateManager::Push(state_type newState, bool execute){
    state_unit* new_state = new state_unit(newState);
    new_state->parent = cur_state;
    cur_state = new_state;
    if ( execute == true )
    {
        exec(cur_state->func);
    }
}
Заработало... Хм... Хотя я так не понял что мешало конструктору StateManager не инициализировать state_unit* cur_state; и вывалиться в ошибку при первом запросе ... хм... ну ладно, главное что работает

ps. опять при написании путаю слова ссылка\указатель (в теме)

Добавлено через 14 часов 36 минут
Ещё проблемка по классу -
C++
1
State = new StateManager(0, &Sc.DO);
error C2276: &: недопустимая операция с выражением привязанной функции-члена
Нельзя делать ссылки на методы объектов?

Добавлено через 2 часа 36 минут
Ну да, понял... ведь методы объектов получают скрытый параметр указатель - this... да только как бы сообразить решить эту проблему
0
Evg
Эксперт CАвтор FAQ
21280 / 8302 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
04.02.2010, 16:27 4
Если ты внятно поставишь вопрос, то может быть получишь ответ
0
Автор FAQ
3687 / 964 / 114
Регистрация: 10.01.2010
Сообщений: 2,550
04.02.2010, 16:35  [ТС] 5
Прошу прощения. Сейчас поставлю вопрос более четко:
Есть класс Game. В нем есть StateManager который управляет состояниями игры. Состояние это связка числа-эвента и предыдущего состояния (для организации стека).
В Sc есть метод DO который выполняет через switch-case число-эвент.
Вернемся к StateManager - он должен обеспечивать добавление\удаление состяний и выполнение привязанных функций. Так вот когда допустим игрок нажимает кнопку новая игра игра должна добавить состояние допустим GAME_START и сразу же выполнить Sc.DO(GAME_START)
0
Evg
Эксперт CАвтор FAQ
21280 / 8302 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
04.02.2010, 16:38 6
Я имею в виду применительно к исходникам. Я толком не могу понять, в чём проблема. Тебе нужно записать указатель на метод или чего? Просто когда перед глазами устаревшие исходники, новый вопрос и выдача ошибки компилятора без привязки к номеру строки исходника - тут мозг ломается на этапе выяснения того, а что же нужно
0
Автор FAQ
3687 / 964 / 114
Регистрация: 10.01.2010
Сообщений: 2,550
04.02.2010, 16:43  [ТС] 7
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class GAME
{
private:
    SCENE* Sc;
public:
    GAME::GAME(SCENE* linkSc);
    GAME::~GAME();
    StateManager* State;
   /* etc */
}
 
GAME::GAME(SCENE* newSc){
    Sc = newSc;
    Duel.Sc = newSc;
    State = new StateManager(0, &Sc->DO);
}
Выглядит это так, ошибка на 15 строке. В принципе понятно почему. Но как реализовать? Может StateManager в Sc? Хм...
0
Evg
Эксперт CАвтор FAQ
21280 / 8302 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
04.02.2010, 17:10 8
Вот скажу тебе честно, чтобы что-то понять, надо смотреть сначала на код из поста #7, потом на код из поста #3, потом на код из поста #1. По словесному описанию я могу догадаться, что Sc->DO это есть метод. Но я не могу понять логики всей этой бодяги. Если тебе нужно правильно описать указатель на метод, то должно быть так:

C++
1
typedef void (SCENE::*executor)(int); // описываем указатель на функцию - метод класса SCENE
1
Автор FAQ
3687 / 964 / 114
Регистрация: 10.01.2010
Сообщений: 2,550
04.02.2010, 17:37  [ТС] 9
Вообще смысл был чтобы StateManager пнул Sc чтобы тот выполнил необходимый код в своем методе DO. Однако не хотелось привязываться в StateManager так конкретно. Чтож, пожалуй этого не избежать.
0
04.02.2010, 17:37
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.02.2010, 17:37
Помогаю со студенческими работами здесь

Будет ли определен компилятором конструктор по умолчанию, если есть конструктор с дефолтным параметром?
Добрый день, сразу к делу, есть некий класс class some { int x; public: some(int y = 1)...

Создать класс. Написать конструктор по умолчанию, конструктор с параметрами. Перегрузить операции «меньше» и «равно»
Помогите пожалуйста, хоть с одним из заданий. 1. Создать класс. Написать конструктор по...

Не могу правильно сделать конструктор и конструктор копирования и принадлежность точки с заданными координатами треугольнику
#include "stdafx.h" #include <iostream> #include <conio.h> #include <windows.h> #include...

Можно ли использовать конструктор по умолчанию и конструктор инициализации одновременно?
Можно ли использовать конструктор по умолчанию и конструктор инициализации одновременно?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru