Использовать только структуры C и оставаться OOPy? - PullRequest
2 голосов
/ 19 октября 2010

Скажем, у вас есть:

struct c_struct {
   int value;
   /* other stuff */
   void (* dump)();
};

и вы хотели бы, в какой-то момент:

c_struct_obj->dump();

Я предполагаю, что нет никакого способа, которым вы могли бы создать экземпляр объекта c_struct, чтобы его конкретная функция "dump" знала свое конкретное "значение" так, как методы C ++ знают переменные-члены (я полагаю, через неявное "this")? Наверное, я уже знаю ответ («нет»). Если да, есть ли другие способы использования структур C в OOPy?

Ответы [ 4 ]

6 голосов
/ 19 октября 2010

Конечно, вам просто нужно передать this самостоятельно:

struct c_struct {
    int value;
    /* other stuff */
    void (* dump)(struct c_struct *this);
};

И затем вызвать его с помощью:

c_struct_obj->dump(c_struct_obj);
0 голосов
/ 19 октября 2010

Вы можете сделать это и даже наследовать. Но взаимодействие с ним - полный беспорядок, и вы не приблизились, например, к безопасности ресурсов, связанной с детерминированной автоматической очисткой C ++. В конечном счете, вы МОЖЕТЕ сделать ООП в C, но это не стоит хлопот по сравнению с использованием C ++, а также всеми другими функциями, которые предлагает C ++.

0 голосов
/ 19 октября 2010

Если вы используете компилятор C ++, единственная разница между структурой и классом заключается в видимости по умолчанию переменных-членов (классы являются закрытыми, а структуры - открытыми)Этот указатель доступен в функциях-членах.

struct test
{
    int x;

    void inc();
};

void test::inc()
{
    x++;
}

int main(void)
{
    test a;
    a.x = 1;
    a.inc();
    int b = a.x;

    return 0;
}

b == 2 здесь.

0 голосов
/ 19 октября 2010

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

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