Язык программирования C++ для профессионалов



         

Гибридный проект - часть 2


extern "C" { #include <math.h> }

и стандартные математические функции из библиотеки можно использовать так же, как и в С. Для всех основных библиотек такое включение должно быть сделано теми, кто поставляет библиотеки, так что программист на С++ даже не будет знать, на каком языке реализована библиотечная функция. Использование библиотек, написанных на таких языках как С, является первым и вначале самым важным способом повторного использования на С++.

На следующем шаге, когда станут необходимы более сложные приемы, средства, реализованные на таких языках как С или Фортран, представляются в виде классов за счет инкапсуляции структур данных и функций в интерфейс классов С++. Простым примером введения более высокого семантического уровня за счет перехода от уровня процедур плюс структур данных к уровню абстракции данных может служить класс строк из §7.6. Здесь за счет инкапсуляции символьных строк и стандартных строковых функций С получается новый строковый тип, который гораздо проще использовать.

Подобным образом можно включить в иерархию классов любой встроенный или отдельно определенный тип. Например, тип int можно включить в иерархию классов так:

class Int : public My_object { int i; public: // definition of operations // see exercises [8]-[11] in section 7.14 for ideas // определения операций получаются в упражнениях [8]-[11] // за идеями обратитесь к разделу 7.14 };

Так следует делать, если действительно есть потребность включить такие типы в иерархию.

Обратно, классы С++ можно представить в программе на С или Фортране как функции и структуры данных. Например:

class myclass { // representation public: void f(); T1 g(T2); // ... };

extern "C" { // map myclass into C callable functions:

void myclass_f(myclass* p) { p->f(); } T1 myclass_g(myclass* p, T2 a) { return p->g(a); } // ... };

В С-программе следует определить эти функции в заголовочном файле следующим образом:

// in C header file

extern void myclass_f(struct myclass*); extern T1 myclass_g(struct myclass*, T2);




Содержание  Назад  Вперед