c функции классов

Хорошо это может быть глупым вопросом для многих из Вас. Позвольте мне снабдить это предисловием со списком в порядке языков, которые я выучил за прошлые 10 лет. [между прочим, я понимаю, что некоторые из них являются языками сценариев]

  • vb 6.0
  • HTML
  • asp
  • php
  • CSS
  • JavaScript
  • управляемый C++
  • c#
  • C++
  • C
  • ASM

Да я знаю, что запустил в полном противоположном конце, но надо надеяться список мешает мне то, чтобы быть подвергнутым критике очень с этим heh.

ВОПРОС: Есть ли в простом C классы... Я знаю, что существуют структуры... Также я хотел бы знать, можно ли объявить функции в структурах/классах C (если они существуют). Я думаю, что ответ обоим не, но трудно найти информацию о плоскости C в Интернете, как большинство вещей для C++. Кроме того, я интересуюсь знанием любых подсказок, приемов или предупреждения для работы с C. Много заранее спасибо.

BTW: я интересуюсь C в целях мобильности и скорости.

5
задан Kelly Elton 12 December 2009 в 03:43
поделиться

5 ответов

Classes in C are most often simulated by structs combined with function pointers. Non-virtual functions can be passed alongside a pointer to the struct, like so:

int obj_compare_funct(Obj *a, Obj *b);
int result = compare_two_objects(obj1, obj2, obj_compare_func);

But the real fun starts when you embed the pointers in the struct; this means objects of the same overall "class" can have different "methods". The biggest syntactic downside is that the function pointed to does not automatically know for which object it is being called. So the object needs to be passed as well, which makes for a bit more typing than is normally desirable. For instance:

/***** In the animal.h header file. *****/
typedef struct Animal {
    char *name;
    void (* speak)(Animal *this);   /* The speak "method" */
} Animal;

/* Constructors for various animal types.  Implementation detail: set the animal's speak method to the appropriate one for that animal type. */
extern Animal *make_feline(char *name);
extern Animal *make_rodent(char *name);

/***** Somewhere in zoo.c, which #includes animal.h. *****/
Animal *cat = make_feline("Tom");
Animal *mouse = make_rodent("Jerry");

cat->speak(cat);  /* Print "Tom says meow!" */
mouse->speak(mouse);  /* Print "Jerry says squeak!" */

This example is a bit looser than the inheritance model provided by languages such as Java -- an Animal instance can have any behaviour at all, rather than one of a specific set of behaviours depending on its subclass. To make things a bit stricter, the methods are usually combined into a struct called a vtable (virtual function table). One vtable is pre-made for each subtype, and the appropriate one pointed to from the instance.

Note that none of this directly helps you have different fields for each subtype -- that's trickier (especially syntactically) and can be done either by the trick of casting an object to its first member, e.g.:

/* Can be treated as an Animal if you cast its pointer. */
typedef struct Cat { Animal super; int num_fleas; } Cat;

Or using opaque pointers, e.g.

typedef struct Animal { char *name; void *species_specific_data; } Animal;

Where the extra fields would be hidden away behind that void * pointer, and accessible through the methods particular to that species.

6
ответ дан 18 December 2019 в 11:57
поделиться

C не имеет классов, а структуры в C не могут иметь внутри себя функций.

2
ответ дан 18 December 2019 в 11:57
поделиться

C doesn't have classes. That was one reason for the creation of C++, besides function overloading, operator overloading, and templates.

Of course, code acting class-like was sometimes written long before the existence of C++:

typedef struct class1 class1;

struct class1 {
    int (*constructor) (class1 *this);
    int (*destructor) (class1 *this);
    ...
};
5
ответ дан 18 December 2019 в 11:57
поделиться

Между структурами C и C ++ существует много различий, и да, в C. нет классов.

Например, рассмотрим следующий код:

struct demo
{
    int a;//public by default

    void set()// valid in C++, invalid in C
    {
        //do something with a
    }
};

Другие различия между структурами C и C ++ заключаются в :

-> Конструкторы и деструкторы для инициализации и уничтожения объектов.

-> Поддержка перегрузки операторов, шаблонов, механизма обработки исключений и т. Д. В структурах C ++.

Общие свойства между структурами в C и структурами POD в C ++:

1) Элементы данных распределяются таким образом, чтобы более поздние члены имели более высокие адреса в объекте, за исключением случаев, когда они разделены спецификатором доступа.

2) Два типа POD-структур совместимы с макетом, если они имеют одинаковые количество нестатических элементов данных и соответствующие нестатические элементы данных (по порядку) имеют типы, совместимые с макетом. POD-структура может содержать безымянное заполнение.

3) Указатель на объект POD-структуры, соответствующим образом преобразованный с использованием переинтерпретируемого преобразования, указывает на его начальный член и наоборот, подразумевая, что в начале POD-структура.

4) POD-структура может использоваться с макросом offsetof.

Source -wiki

1
ответ дан 18 December 2019 в 11:57
поделиться

Вспомните, что C был создан в 1972 году, задолго до того, как идеи объектно-ориентированного программирования получили широкое распространение. В то время объектно-ориентированное программирование было ограничено очень немногими языками, такими как Simula 67.

Итак, нет, в C нет классов.

1
ответ дан 18 December 2019 в 11:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: