C ++ назначить карту разных классов - PullRequest
0 голосов
/ 28 июня 2018

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

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

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

Вот пример:

#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 </p>

Ответы [ 2 ]

0 голосов
/ 28 июня 2018

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

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

  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;
}
0 голосов
/ 28 июня 2018

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

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();
...