Есть ли способ получить объект класса в функции stati c, кроме передачи его в качестве параметра? - PullRequest
0 голосов
/ 10 апреля 2020

Есть ли способ получить объект класса в функции класса stati c, кроме передачи его в качестве аргумента функции? Я не могу передать его в качестве аргумента или сделать мой класс синглтоном.

class test{
public:
    int i=10;
    test(){}
    Static test_static_method(){
        // somehow get an object of the class to call class member.
        std::cout << classObj->i << "\n";
    }
};

Я пытаюсь передать функцию stati c в C -API, который принимает void (*) (). Но мне нужен экземпляр класса в моей функции для доступа к данным класса. Любая помощь приветствуется.

Ответы [ 2 ]

1 голос
/ 11 апреля 2020

Если у вас не будет слишком много экземпляров вашего класса, вы можете использовать предварительно выделенный «пул обратных вызовов» - предварительно созданные функции, которые вы выделяете при необходимости для обратных вызовов:

#define REP10(P, M)  M(P##0) M(P##1) M(P##2) M(P##3) M(P##4) M(P##5) M(P##6) M(P##7) M(P##8) M(P##9)
#define REP100(M) REP10(,M) REP10(1,M) REP10(2,M) REP10(3,M) REP10(4,M) REP10(5,M) REP10(6,M) REP10(7,M) REP10(8,M) REP10(9,M)

typedef void (*callback_fn_t)(void);  // or whatever signature you need

class myclass {
    static struct callback_t {
        callback_t      *next;
        callback_fn_t   callback;
        myclass         *obj;
    } callback_table[100];
    callback_t          *my_callback;
    static callback_t   *freelist;
#define CB_FUNC_DECL(M)  static void cbfunc##M() { callback_table[M].obj->callback(); }
    REP100(CB_FUNC_DECL)

 public:
    callback_fn_t get_callback() {
        if (!my_callback) {
            if (!freelist) return nullptr;
            my_callback = freelist;
            freelist = my_callback->next;
            my_callback->obj = this; }
        return my_callback->callback;
    }
    void callback() {
        /* this non-static method is called by the callback */
    }

    myclass() : my_callback(nullptr) { }
    myclass(const myclass &a) : my_callback(nullptr) {
        // need to manually define copy
    }
    ~myclass() {
        if (my_callback) { 
            my_callback->obj = nullptr;
            my_callback->next = freelist;
            freelist = my_callback; }
    }
};

#define CB_TABLE_INIT(M) { M ? myclass::callback_table+M-1 : 0, myclass::cbfunc##M },
myclass::callback_t myclass::callback_table[100] = { REP100(CB_TABLE_INIT) };
myclass::callback_t *myclass::freelist = &myclass::callback_table[99];

Теперь, если вы хотите использовать один из этих объектов в качестве обратного вызова, вы вызываете get_callback, чтобы получить указатель функции, который вы даете библиотеке C, и она вызовет метод callback в вашем классе для этого объекта.

0 голосов
/ 10 апреля 2020

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

Ответ на ваш вопрос "Нет" по причине. Объекты уникальны, и любой объект одного и того же класса может (и обычно будет) содержать разные данные. Когда вы говорите о stati c функциях / членах класса, различные объекты одного и того же класса всегда будут содержать точно такие же данные в этих stati c функциях / членах.

Однако, если из по какой-то причине (возможно, из-за ошибки архитектуры), вам не важно, к какому объекту вы будете обращаться, используя функцию stati c, вы можете сделать свой класс singleton (что означает, что у вас всегда будет только один экземпляр ваш класс, и вы всегда будете знать, какие данные объекта вы будете использовать), или определите экземпляр объекта stati c указатель в вашем классе. Примерно так:

class test {
public:
    int i = 10;
    test *class_obj;
    test() {
        class_obj = this; // The last object that created
    }
    Static test_static_method() {
        // somehow get an object of the class to call class member.
        std::cout << class_obj->i << "\n";
    }
};

Читайте о:

Синглтон
C ++ Синглтон
Stati c члены в C ++

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...