Возможно ли получить доступ к методам класса из экземпляра класса в glib? - PullRequest
0 голосов
/ 28 февраля 2019

Я получаю следующую ошибку при попытке вызвать функцию «talk» моего DogClass: «talk» не является членом _DogFile.

Фактически я объявил файл dog в _DogFileClassstruct, а в class_init я указываю на функцию talk.Как я могу получить доступ к методу класса из экземпляра класса?

Я включил соответствующий код:

dog.h:

struct _DogFileClass
{
    GObjectClass parent_class;
    void (*talk)(DogFile *self)
}

void dog_file_talk(DogFile *self);

dog.c

void dog_file_real_talk(DogFile *self);

void dog_file_class_init(DogFileClass *klass)
{
    klass->talk = dog_file_real_talk;
}

void dog_file_talk(DogFile *self)
{
    g_return_if_false(DOG_IS_FILE);
    DogFileClass *klass = DOG_FILE_GET_CLASS(self);
    return klass->talk(self);
}

dog_file_real_talk(DogFile *self)
{
    printf("WOOF")
}

и в заключение я бы хотел использовать функцию talk следующим образом: dog->talk(dog); когда dog - указатель на класс DogFile

1 Ответ

0 голосов
/ 28 февраля 2019

и в конце я бы хотел использовать функцию разговора следующим образом: dog-> talk (собака);когда dog является указателем на класс DogFile

Это невозможно, поскольку talk не является членом структуры DogFile.Ваш код в dog_file_talk() выглядит правильно, поэтому вместо того, чтобы пытаться использовать dog->talk (dog), используйте dog_file_talk (dog).

Боюсь, это самое близкое к OOP в C с GObject.Если бы вы имели элемент talk в структуре DogFile, этот указатель дублировался бы для каждого экземпляра DogFile, что предотвратило бы его переопределение подклассами, а также трата памяти.

Если вы хотите более «естественный» ООП, используйте C ++ (или более современный язык, такой как Rust).

...