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

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

03.02.2010, 22:10. Показов 3794. Ответов 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
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
03.02.2010, 22:10
Ответы с готовыми решениями:

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

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

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

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

Потом структура state_unit имеет конструктор с двумя параметрами, но конструктор класса StateManager, сожержащего экземпляр типа state_unit, не имеет внутри себя вызов конструктора state_unit
0
Автор FAQ
 Аватар для insideone
3687 / 964 / 114
Регистрация: 10.01.2010
Сообщений: 2,550
04.02.2010, 16:21  [ТС]
Переписал .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
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
04.02.2010, 16:27
Если ты внятно поставишь вопрос, то может быть получишь ответ
0
Автор FAQ
 Аватар для insideone
3687 / 964 / 114
Регистрация: 10.01.2010
Сообщений: 2,550
04.02.2010, 16:35  [ТС]
Прошу прощения. Сейчас поставлю вопрос более четко:
Есть класс Game. В нем есть StateManager который управляет состояниями игры. Состояние это связка числа-эвента и предыдущего состояния (для организации стека).
В Sc есть метод DO который выполняет через switch-case число-эвент.
Вернемся к StateManager - он должен обеспечивать добавление\удаление состяний и выполнение привязанных функций. Так вот когда допустим игрок нажимает кнопку новая игра игра должна добавить состояние допустим GAME_START и сразу же выполнить Sc.DO(GAME_START)
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
04.02.2010, 16:38
Я имею в виду применительно к исходникам. Я толком не могу понять, в чём проблема. Тебе нужно записать указатель на метод или чего? Просто когда перед глазами устаревшие исходники, новый вопрос и выдача ошибки компилятора без привязки к номеру строки исходника - тут мозг ломается на этапе выяснения того, а что же нужно
0
Автор FAQ
 Аватар для insideone
3687 / 964 / 114
Регистрация: 10.01.2010
Сообщений: 2,550
04.02.2010, 16:43  [ТС]
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
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
04.02.2010, 17:10
Вот скажу тебе честно, чтобы что-то понять, надо смотреть сначала на код из поста #7, потом на код из поста #3, потом на код из поста #1. По словесному описанию я могу догадаться, что Sc->DO это есть метод. Но я не могу понять логики всей этой бодяги. Если тебе нужно правильно описать указатель на метод, то должно быть так:

C++
1
typedef void (SCENE::*executor)(int); // описываем указатель на функцию - метод класса SCENE
1
Автор FAQ
 Аватар для insideone
3687 / 964 / 114
Регистрация: 10.01.2010
Сообщений: 2,550
04.02.2010, 17:37  [ТС]
Вообще смысл был чтобы StateManager пнул Sc чтобы тот выполнил необходимый код в своем методе DO. Однако не хотелось привязываться в StateManager так конкретно. Чтож, пожалуй этого не избежать.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
04.02.2010, 17:37
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru