С ++ назначить карте разные классы

На данный момент у меня возникла следующая проблема:
Я хочу назначить объект класса также структуру карты

Моя цель: Если я вызываю карту с идентификаторами внутри скобок, функция должна запускаться!

Я знаю, что следующий подход не работает. Но я был бы очень любезен, мне кто-нибудь может дать идею или совет, как я могу реализовать этот подход ...

Вот пример:

#include <map>
#include <functional>
#include <iostream>

class start {
    public:
        void sayhello() {
            std::cout << "Hallo!!" << std::endl;
        }
};

class end {
    public:
        void saybye() {
            std::cout << "Bye!" << std::endl;
        }
}


typedef void (*method)(void);


int main() {

    std::map<int, std::map<int, std::map<int, method>>> myMap;
    myMap[1][5][10] = start::sayhello;
    myMap[2][1][20] = end::saybye;

    // // usage:
    myMap[1][5][10]();
    myMap[2][1][20]();
}

Большое спасибо за вашу помощь! <3

Вы можете держать std::function на своей карте.

Jesper Juhl 28.06.2018 17:39

Вы назначаете тег «oop». Вероятно, решение должно быть СОВЕРШЕННО иным, разработанным в ООП. Но в чем настоящая проблема? (карта референсов, производных классов, но трудно угадать, что ты хочешь). Сегодняшняя попытка полностью исключена из объектно-ориентированного программирования.

Jacek Cz 28.06.2018 18:13
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
86
2

Ответы 2

Обычно функция-член вызывается из экземпляра своего класса:

class Bar
{
public:
    void fun() {.....};
};

//somewhere in your code
Bar b;
b.fun();

Хорошая новость заключается в том, что вы можете избежать экземпляра класса, сделав функцию статический

class Bar
{
public:
    static void fun() {.....};
};

//somewhere in your code
Bar::fun();

Благодарность! Но как я могу вставить различные статические функции в std :: map?

N. Men 28.06.2018 17:47

Просто введите статический перед двумя функциями. И исправьте опечатку: добавьте ; в конец endclass.

Ripi2 28.06.2018 17:50

но когда я использую static, я должен создать экземпляр класса. Нет ли прямого решения? Чтобы создать экземпляр внутри карты?

N. Men 28.06.2018 17:58

@ N.Men Смысл "статики" в том, что вы избегаете создания экземпляров. См. Ответ Шриканта, он исправил ваш код, и теперь он работает.

Ripi2 28.06.2018 18:01

Код в текущем виде работать не будет.

Доступны два подхода:

  1. Объявите его просто как функцию, а не как функцию-член внутри класса.
  2. Объявите функцию-член как статическую функцию.

Код для 2-го подхода приведен ниже:

#include <map>
#include <functional>
#include <iostream>
using namespace std;

class start {
    public:
        static void sayhello() {
            std::cout << "Hallo!!" << std::endl;
        }
};

class end {
    public:
        static void saybye() {
            std::cout << "Bye!" << std::endl;
        }
};


typedef void (*method)(void);


int main() {

    std::map<int, std::map<int, std::map<int, method>>> myMap;
    myMap[1][5][10] = start::sayhello;
    myMap[2][1][20] = end::saybye;

    // // usage:
    myMap[1][5][10]();
    myMap[2][1][20]();
    return 0;
}

Другие вопросы по теме