#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