Использование указателя на функции внутри структур в C

#c #data-structures #struct

#c #структуры данных #структура

Вопрос:

Только для s amp; g. Я хотел создать свою собственную библиотеку на C. Я хотел, чтобы это соответствовало понятию объекта C #, и понял, что единственный способ сделать это — заставить базовые типы использовать указатели на функции в качестве своих членов.

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

 #ifndef STRING_H
#define STRING_H

typedef struct _string
{
    char* Value;
    int Length;
    String* (*Trim)(String*, char);

} String;

String* String_Allocate(char* s);
String* Trim(String* s, char trimCharacter);

#endif  /* STRING_H */
  

И реализация:

 String* Trim(String* s, char trimCharacter)
{
    int i=0;
    for(i=0; i<s->Length; i  )
    {
        if( s->Value[i] == trimCharacter )
        {
            char* newValue = (char *)malloc(sizeof(char) * (s->Length - 1));
            int j=1;

            for(j=1; j<s->Length; j  )
            {
                newValue[j] = s->Value[j];
            }

            s->Value = newValue;
        }
        else
        {
            break;
        }
    }

    s->Length = strlen(s->Value);
    return s;
}

String* String_Allocate(char* s)
{
    String* newString = (String *)malloc(sizeof(String));
    newString->Value = malloc(strlen(s)   1);
    newString->Length = strlen(s)   1;
    strcpy(newString->Value, s);

    newString->Trim = Trim;
}
  

Однако при компиляции этого в NetBeans (для c, C ) Я получаю следующую ошибку:

 In file included from String.c:6:
String.h:8: error: expected specifier-qualifier-list before ‘String’
String.c: In function ‘String_Allocate’:
String.c:43: error: ‘String’ has no member named ‘Trim’
make[2]: *** [build/Debug/GNU-Linux-x86/String.o] Error 1
make[1]: *** [.build-conf] Error 2
make: *** [.build-impl] Error 2

BUILD FAILED (exit value 2, total time: 77ms)
  

Кто-нибудь может помочь мне понять, почему элемент String-> Trim не существует и / или как это исправить?

Спасибо

Комментарии:

1. Ищите GObject, если хотите иметь возможность выполнять любой полиморфизм. Или просто используйте C — C не является объектно-ориентированным, и, на мой взгляд, в тот момент, когда вы пытаетесь сделать это так, вам не следует его использовать. Одним из наиболее распространенных симптомов, по-видимому, является удаление типа struct

Ответ №1:

С рекурсивной структурой вам нужно написать

 typedef struct _string String;
  

перед определением структуры или внутри, где вы должны String заменить ее на struct _string (только до тех пор, пока typedef она не войдет в область видимости).

Комментарии:

1. Смогли бы вы написать объявление? Я понятия не имею, что это значит.

2. Измените String* (*Trim)(String*, char); на struct _string* (*Trim)(struct _string*, char);

Ответ №2:

Разделите его на отдельный typedef и объявление поля и посмотрите, поможет ли это.

Ответ №3:

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

Возможно, вам захочется провести небольшое исследование по объектно-ориентированному программированию на C, потому что некоторые люди занимались этим еще до того, как появился C . http://www.planetpdf.com/codecuts/pdfs/ooc.pdf