#c #pointers #struct
#c #указатели #структура
Вопрос:
Я пишу программу на C и настраиваю структуру, которая будет использоваться внутри другой структуры, вот так:
typedef VOID(WINAPI* OriginalFunc)(PVOID);
struct C_Child
{
VOID GetName( )
{
return ((OriginalFunc*)(this))[0x0000](this);
}
};
Затем:
struct C_Parent
{
struct C_Child* Child;
} Parent;
Однако, когда я вызываю свою структуру следующим образом:
Parent.Child->GetName();
Чтобы получить доступ к функции «getName» внутри моего дочернего класса из родительского, я всегда не могу выполнить компиляцию, и мне выдаются многочисленные синтаксические ошибки.
Прежде чем меня будут слишком сильно ругать, я просто уведомлю всех здесь, что я в основном работаю на C , и я делал это много раз, прежде чем использовать его — я знаю, что языки разные, но я серьезно просто смущен тем, почему это вызывает такую проблему.
Есть ли у кого-нибудь идеи о том, как я могу это исправить или, возможно, достичь того же результата другим способом?
Любая помощь приветствуется.
Комментарии:
1. Вы не можете определять функции (такие как
GetName()
) внутри структуры в C. C не обеспечивает группировку кода и данных, которую выполняет C .2. Черт возьми. Да, у меня были некоторые предположения, но я не думал, что это результат того, как язык обработал это. Спасибо, @JonathanLeffler!
3. Пожалуйста: ошибка в тексте (копировать-вставить), а не в виде скриншота!
Ответ №1:
Я думаю, это то, что вы хотите:
VOID WINAPI C_Child_GetName(PVOID a) {
// ...
}
struct C_Child {
OriginalFunc GetName;
} Child = {
.GetName = C_Child_GetName,
};
struct C_Parent {
struct C_Child *Child;
} Parent = {
.Child = amp;Child,
};
Это позволяет выполнять запрошенные
Parent.Child->GetName();
Протестировано с использованием
typedef void VOID;
typedef void *PVOID;
#define WINAPI
typedef VOID (WINAPI *OriginalFunc)(PVOID);
Комментарии:
1. К сожалению, Джон был прав насчет моей проблемы. Это выглядит действительно хорошо, но, по-видимому, язык не может обрабатывать группирующие индексы, которые может C . : (
2. Вы уже знали, что синтаксис, который вы хотели, был запрещен. Я предоставил правильный синтаксис для достижения того, что вы хотели сделать (
Parent.Child->GetName();
)
Ответ №2:
Я не уверен, что понимаю, что вы хотите сделать:(
Вы не можете иметь функцию внутри структуры, но вы можете написать код, подобный этому
#include <stdio.h>
#include <windows.h>
typedef void* (*pFV)(void*);
typedef struct
{
pFV name[4];
} C_Child;
typedef struct
{
C_Child* Child;
} Parent;
void* GetName(void* v)
{
printf("GetName()n");
return v;
}
int main(void)
{
Parent parent;
C_Child child;
child.name[0] = GetName;
parent.Child = amp;child;
(parent.Child->name[0])(NULL);
}
И адреса функции загрузки внутри дочернего класса. Это обычная конструкция, подобная таблице виртуальных функций, и часто используется в Windows и других системах
Эта строка
(parent.Child->name[0])(NULL);
вызывает функцию GetName()
, как и ожидалось.
Это то, что вы хотите?