Russian Qt Forum

Программирование => С/C++ => Тема начата: Zerkin от Февраль 18, 2015, 14:50



Название: Вопрос по C++/CLI
Отправлено: Zerkin от Февраль 18, 2015, 14:50
Товарищи, понадобилось обернуть CLI'ем некоторый код на плюсах и отдать либу на использование в дотнете. Не ругайте строго если вопрос тривиальный, первый раз таким занимаюсь.

Собственно есть у нас два класса unmanaged.

Код
C++ (Qt)
class GeoPoint
{
public:
GeoPoint(double latitude = 0.0, double longtitude = 0.0) :
_latitude(latitude), _longtitude(longtitude) {}
 
double latitude() const {return _latitude;}
double longtitude() const {return _longtitude;}
 
private:
double _latitude;
double _longtitude;
};
 
class GeoSquare
{
public:
GeoSquare  (GeoPoint topLeft = GeoPoint(), GeoPoint topRight = GeoPoint(), GeoPoint bottomLeft = GeoPoint(), GeoPoint bottomRight = GeoPoint())
 : _topLeft(topLeft), _topRight(topRight), _bottomLeft(bottomLeft), _bottomRight(bottomRight) {}
 
GeoPoint topLeft() const {return  _topLeft;}
GeoPoint topRight() const {return  _topRight;}
GeoPoint bottomLeft() const {return  _bottomLeft;}
GeoPoint bottomRight() const {return  _bottomRight;}
 
private:
GeoPoint _topLeft;
GeoPoint _topRight;
GeoPoint _bottomLeft;
GeoPoint _bottomRight;
};

Теперь оборачиваем их.

Код
C++ (Qt)
//Wrapper
namespace GeoDll
{
public ref class WrGeoPoint
{
public:
WrGeoPoint(double latitude, double longtitude);
 
double lattitude();
double longtitude();
 
private:
GeoPoint        *geoPoint;
};
 
public ref class WrGeoSquare
{
public:
WrGeoSquare(WrGeoPoint topLeft, WrGeoPoint topRight, WrGeoPoint bottomLeft, WrGeoPoint bottomRight);
 
WrGeoPoint topLeft();
WrGeoPoint topRight();
WrGeoPoint bottomLeft();
WrGeoPoint bottomRight();
 
private:
GeoSquare *geoSquare;
};
}
 


Реализация. Для упрощения geoSquare не инициализируем.

Код
C++ (Qt)
GeoDll::WrGeoPoint::WrGeoPoint(double latitude, double longtitude)
{
geoPoint = new GeoPoint(latitude, longtitude);
}
 
double GeoDll::WrGeoPoint::lattitude()
{
return geoPoint->latitude();
}
 
double GeoDll::WrGeoPoint::longtitude()
{
return geoPoint->longtitude();
}
 
GeoDll::WrGeoSquare::WrGeoSquare(WrGeoPoint topLeft, WrGeoPoint topRight, WrGeoPoint bottomLeft, WrGeoPoint bottomRight)
{
 
}

Соберем это всё в dll и подключим в C# проекте.

Код
C#
namespace CS_TEST
{
   class Program
   {
       static void Main(string[] args)
       {        
           //Test GeoPoint
           WrGeoPoint point1 = new WrGeoPoint(10.5, 11.6);
           double longtitude = point1.longtitude();
           double latitude = point1.lattitude();
           longtitude = latitude;
 
           WrGeoPoint point2 = new WrGeoPoint(10.5, 11.6);
 
           WrGeoPoint point3 = new WrGeoPoint(11.8, 14.9);
 
           WrGeoPoint point4 = new WrGeoPoint(26.5, 35.8);
 
          WrGeoSquare square = new WrGeoSquare(point1, point2, point3, point4);
       }
   }
}
 
 

На строчке с созданием square получаем ошибку
Цитировать
error CS0570: '.ctor' is not supported by the language
Не могу понять откуда unmanaged торчит неявно?

WrGeoSquare(WrGeoPoint topLeft, WrGeoPoint topRight, WrGeoPoint bottomLeft, WrGeoPoint bottomRight);

Здесь? Так нельзя делать? На эту мысль наводит то, что если создание square убрать, то всё работает отлично.


Название: Re: Вопрос по C++/CLI
Отправлено: Zerkin от Февраль 18, 2015, 15:21
Решил проблему, передавая в конструктор WrGeoSquare указатели CLI.

Код
C++ (Qt)
GeoPointDll::WrGeoSquare::WrGeoSquare(WrGeoPoint^ topLeft, WrGeoPoint^ topRight, WrGeoPoint^ bottomLeft, WrGeoPoint^ bottomRight)

Не разбираюсь в C#, и в голове совсем перепуталось, что указатели, что ссылки.