LINUX.ORG.RU

Объект в качестве поля структуры.

 ,


1

1

Как вызвать конструктор для объекта, являющегося членом структуры? Есть C проект, к которому прикрутил C++ библиотеку. И вот примерно следующий код

class A{
private:
    int field;
public:
    A() {printf("creating\n");field = 0;};
    ~A() {printf("destroyer\n");};
    void set_field(int a) {field = a;};
    int get_field() {return field;};
};
struct a_t {
    A a;
};
struct a_t* a_new()
{
    struct a_t *a;
    a = (struct a_t*) malloc(sizeof(struct a_t));
    struct a_t b;
    return a;
}
int main()
{
    int what = 1;
    struct a_t *a = a_new();
    printf("%d\n", a->a.get_field());
    a->a.set_field(100);
    printf("%d\n", a->a.get_field());
    return 0;
}

выводит

creating
destroyer
0
100

Т.е. конструктор члена структуры не вызывается, и из-за этого косяки в проекте.
И, чтобы ещё темы не создавать, есть ли возможность создать C обёртку над C++-ным проектом?

★★★★

Последнее исправление: aptyp (всего исправлений: 3)

Есть C проект, к которому прикрутил C++ библиотеку.

Не вижу в твоём сообщении C, только кривущий C++.

Т.е. конструктор члена структуры не вызывается, и из-за этого косяки в проекте.

А с чего ты взял, что он должен вызываться где-то в этом коде?

anonymous
()
Ответ на: комментарий от anonymous

Если бы это был C++, я бы не структурами пользовался.
Не можешь сказать, как его вызвать?

aptyp ★★★★
() автор топика

есть ли возможность создать C обёртку над C++-ным проектом?

Легко, смотри, например ZeroMQ.

anonymous
()

Т.е. конструктор члена структуры не вызывается

Так вызови его.

anonymous
()
Ответ на: комментарий от anonymous

Там же наоборот вроде как, нет?

aptyp ★★★★
() автор топика

Нельзя так делать: после добавления объекта плюсового класса в структуру, она перестала быть POD (Plain Old Data), то есть сишной структурой.

С не POD-объектами нельзя работать сишными методами (побайтовое копирование и тд).

И да, malloc() не вызывает конструкторы, а просто выделяет «сырую» память из кучи. Чтобы потом в ней «сконструировать» объект, нужно вызвать placement new. Но к твоей задаче это не относится, эта «фишка» в основном для всяких библиотек, использующих свои кастомные аллокаторы памяти.

DELIRIUM ☆☆☆☆☆
()
Ответ на: комментарий от aptyp

гугли placement new. но даже с ним деструктор твоего класса А вызван не будет.

nanoolinux ★★★★
()
Ответ на: комментарий от DELIRIUM

Ага, я понял уже, placement new нагуглив. Видимо придётся обойтись без выделения памяти.

aptyp ★★★★
() автор топика

Есть C проект, к которому прикрутил C++ библиотеку.

переведи весь проект в спп и не парь мозг.

nanoolinux ★★★★
()
Ответ на: комментарий от aptyp

а как не скучно? решать проблемы, которые сам же и создал? в смысле наступать на грабли, которые сам же и положил?

nanoolinux ★★★★
()

Вообще не юзай объекты. Сделай обёртку сишную через extern «C» { }, весь нужный функционал заверни в функции и пусть из этой обёртки только эти функции и торчат. И юзай так.

DELIRIUM ☆☆☆☆☆
()
Ответ на: комментарий от DELIRIUM

Мне нужен доступ к одному классу всё-таки. Не мог быть дать ссылку на развёрнутое описание? Так как я всё-таки хочу остаться в рамках С, либо поискать сишную библиотеку.

aptyp ★★★★
() автор топика
Ответ на: комментарий от aptyp

Блин, ну там всё просто. google://use C++ lib in C code даёт гору ссылок. В каждой есть примеры.

DELIRIUM ☆☆☆☆☆
()

Создавать структуру не через malloc, а через new/delete (их можно перегрузить, если что, например чтобы создавать объекты в пуле памяти).

/thread

quiet_readonly ★★★★
()
Ответ на: комментарий от aptyp

Осспаде, нашел таки себе головняк. Сделал бы на яке по туториалу, да вместо прямых вычислений дерево собирал бы и vm небольшой для его редукции. 200 строк же, ну.

anonymous
()
Ответ на: комментарий от false

Если бы это был С++, я бы *только* классами пользовался.

aptyp ★★★★
() автор топика
Ответ на: комментарий от aptyp

Запускаешь миллионник на тестовом выражении мупарсера, и рядом на ванильном luajit'е. Хочешь включи jit, хочешь оставь на интерпретаторе. Истина лучше пруфов.

Как якк оценивался, все еще не понятно.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.