Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

C++

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 25, средняя оценка - 4.84
insideone
Модератор
Автор FAQ
3642 / 921 / 50
Регистрация: 10.01.2010
Сообщений: 2,477
#1

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

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

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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.02.2010, 22:10
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Конструктор ссылки? (C++):

Конструктор форм - C++
Скажите все же что лучше использовать что бы рисовать формочки и программировать под них код?Учил WinApi там можно конечно с помощью...

Конструктор копирования - C++
Здравствуйте! Прошло около недели после изучения c++ и до сих пор на вопрос по конструктору копирования ответа не найдено. Объясните зачем...

Вызывается не тот конструктор - C++
Имеется класс, вот часть его объявления: class MQLCopir : protected ClientCopir { private: bool _fatal; std::string...

Добавить конструктор копирования - C++
нужна помощь с конструктором копирования#include <iostream> using namespace std; class MobilePhone { std::string brandName; ...

Конструктор с параметром-объектом - C++
class a { private: ... public: a (); ... }; class b {

Прблемы с Шаблонами: Конструктор с параметрами, объявление итератора. - C++
Добрый день. Начал изучать шаблоны и сразу же возникло 2 проблемы: 1).На Строке в мейне SArr<short> ar1(100); Выдается ошибка...

8
Evg
Эксперт CАвтор FAQ
18026 / 6258 / 427
Регистрация: 30.03.2009
Сообщений: 17,190
Записей в блоге: 27
03.02.2010, 22:35 #2
Напиши ещё, к какой строке ошибка привязана

Потом структура state_unit имеет конструктор с двумя параметрами, но конструктор класса StateManager, сожержащего экземпляр типа state_unit, не имеет внутри себя вызов конструктора state_unit
0
insideone
Модератор
Автор FAQ
3642 / 921 / 50
Регистрация: 10.01.2010
Сообщений: 2,477
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
18026 / 6258 / 427
Регистрация: 30.03.2009
Сообщений: 17,190
Записей в блоге: 27
04.02.2010, 16:27 #4
Если ты внятно поставишь вопрос, то может быть получишь ответ
0
insideone
Модератор
Автор FAQ
3642 / 921 / 50
Регистрация: 10.01.2010
Сообщений: 2,477
04.02.2010, 16:35  [ТС] #5
Прошу прощения. Сейчас поставлю вопрос более четко:
Есть класс Game. В нем есть StateManager который управляет состояниями игры. Состояние это связка числа-эвента и предыдущего состояния (для организации стека).
В Sc есть метод DO который выполняет через switch-case число-эвент.
Вернемся к StateManager - он должен обеспечивать добавление\удаление состяний и выполнение привязанных функций. Так вот когда допустим игрок нажимает кнопку новая игра игра должна добавить состояние допустим GAME_START и сразу же выполнить Sc.DO(GAME_START)
0
Evg
Эксперт CАвтор FAQ
18026 / 6258 / 427
Регистрация: 30.03.2009
Сообщений: 17,190
Записей в блоге: 27
04.02.2010, 16:38 #6
Я имею в виду применительно к исходникам. Я толком не могу понять, в чём проблема. Тебе нужно записать указатель на метод или чего? Просто когда перед глазами устаревшие исходники, новый вопрос и выдача ошибки компилятора без привязки к номеру строки исходника - тут мозг ломается на этапе выяснения того, а что же нужно
0
insideone
Модератор
Автор FAQ
3642 / 921 / 50
Регистрация: 10.01.2010
Сообщений: 2,477
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
18026 / 6258 / 427
Регистрация: 30.03.2009
Сообщений: 17,190
Записей в блоге: 27
04.02.2010, 17:10 #8
Вот скажу тебе честно, чтобы что-то понять, надо смотреть сначала на код из поста #7, потом на код из поста #3, потом на код из поста #1. По словесному описанию я могу догадаться, что Sc->DO это есть метод. Но я не могу понять логики всей этой бодяги. Если тебе нужно правильно описать указатель на метод, то должно быть так:

C++
1
typedef void (SCENE::*executor)(int); // описываем указатель на функцию - метод класса SCENE
1
insideone
Модератор
Автор FAQ
3642 / 921 / 50
Регистрация: 10.01.2010
Сообщений: 2,477
04.02.2010, 17:37  [ТС] #9
Вообще смысл был чтобы StateManager пнул Sc чтобы тот выполнил необходимый код в своем методе DO. Однако не хотелось привязываться в StateManager так конкретно. Чтож, пожалуй этого не избежать.
0
04.02.2010, 17:37
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.02.2010, 17:37
Привет! Вот еще темы с ответами:

Можно ли создать глобальный обект, вызвав для него закрытый конструктор? - C++
Можно ли создать глобальный объект, вызвав для него закрытый конструктор? Как?

Ссылки С++ - C++
На днях я испытал состояние когнитивного диссонанса и одновременно разочарования в себе и своём любимом языке программирования. Всё...

Передача ссылки в функцию в DLL - C++
Здравствуйте. По этому мануалу сделал DLL https://msdn.microsoft.com/ru-ru/library/ms235636.aspx Возникла проблема с передачей...

Возвращение ссылки на локальный объект - C++
int& foo() { int a; //: warning C4172: возвращение адреса локальной или временной переменной return a; } ...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru