Ada_Ru форум

Обсуждение языка Ада

Деструкторы в импортированных C++ классах

Оставить новое сообщение

Сообщения

Иван Левашев
Деструкторы в импортированных C++ классах
2009-06-06 20:36:34

Интересует, можно ли заинтерфейсить деструктор для C++ класса? Потому что без этой фичи ничего толком C++ заинтерфейсить не получится, придётся всё в Controlled оборачивать.

 

А если эта фича есть, то можно, наоборот, сделать легковесный аналог Controlled.

 

Попробовал на GNAT 2009 заинтерфейсить demo.hpp:

 

 

class demo {

demo();

demo(demo& another);

~demo();

demo& operator = (const demo& right);

};

 

командой g++ -c -fdump-ada-spec demo.hpp

 

Получается:

 

with Interfaces.C; use Interfaces.C;

 

package demo_hpp is

 

package Class_demo is

type demo is limited record

null;

end record;

pragma Import (CPP, demo);

 

function New_demo return demo; -- demo.hpp:3:8

pragma CPP_Constructor (New_demo, "_ZN4demoC1Ev");

 

function New_demo (another : access demo) return demo; -- demo.hpp:4:21

pragma CPP_Constructor (New_demo, "_ZN4demoC1ERS_");

 

procedure Delete_demo (this : access demo); -- demo.hpp:5:9

pragma Import (CPP, Delete_demo, "_ZN4demoD1Ev");

 

function operator_as (this : access demo; right : access constant demo) return access demo; -- demo.hpp:6:38

pragma Import (CPP, operator_as, "_ZN4demoaSERKS_");

end;

use Class_demo;

end demo_hpp;

 

Судя по всему, деструкторы только для указателей. Вообще, надо проверить, а вдруг GNAT–таки вставляет вызов деструктора при уничтожении demo.

 

Сделал проект для gprbuild, проверил.

 

Исходники:

 

===demo.hpp===

 

class demo {

demo();

demo(demo& another);

~demo();

demo& operator = (const demo& right);

};

 

===demo.cpp===

#include <iostream>

 

#include "demo.hpp"

 

using namespace std;

 

demo::demo() {

cout << "demo()" << endl;

}

 

demo::demo(demo& another) {

cout << "demo(demo& another)" << endl;

}

 

demo::~demo() {

cout << "~demo()" << endl;

}

 

demo& demo::operator = (const demo& right) {

cout << "demo& operator = (const demo& right)" << endl;

}

 

===demo.gpr===

project Demo is

 

for Source_Dirs use (".");

for Languages use ("Ada", "C++");

for Main use ("main.adb");

 

package Compiler is

for Default_Switches ("Ada") use ("-g", "-gnat05", "-gnatwA");

end Compiler;

 

package Naming is

for Specification_Suffix ("C++") use ".hpp";

for Implementation_Suffix ("C++") use ".cpp";

end Naming;

 

end Demo;

 

===main.adb===

with demo_hpp; use demo_hpp;

 

procedure main is

 

use demo_hpp.Class_demo;

 

a1 : demo;

 

procedure Local is

a2 : demo;

pragma RAII(a2);

begin

null;

end Local;

 

begin

Local;

end main;

 

=== вывод ===

demo()

demo()

 

Вот такие пироги :(

 

-- If you want to get to the top, you have to start at the bottom

Иван Левашев wrote:

 

Интересует, можно ли заинтерфейсить деструктор для C++ класса? Потому что без этой фичи ничего толком C++ заинтерфейсить не получится, придётся всё в Controlled оборачивать.

 

А если эта фича есть, то можно, наоборот, сделать легковесный аналог Controlled.

 

_ZN4demoD1Ev и есть деструктор. Но надеяться на автоматический вызов в настоящее время не стоит а следовательно и Controlled остаётся на месте.

Новое сообщение:
Страницы: 1

Чтобы оставить новое сообщение необходимо Зарегистрироваться и Войти