Использование указателя на функции внутри структур в C - PullRequest
1 голос
/ 12 апреля 2011

Только для s & 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 ++) Iполучить следующую ошибку:

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 не существует и / или как это исправить?

Спасибо

Ответы [ 3 ]

5 голосов
/ 12 апреля 2011

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

typedef struct _string String;

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

0 голосов
/ 12 апреля 2011

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

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

0 голосов
/ 12 апреля 2011

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

...