Как выполнить отслеживание следующих объектов C ++ в C ++ / CLI? - PullRequest
1 голос
/ 04 января 2012

Я немного запутался в том, как преобразовать нижеупомянутый объект C ++ в c ++ / CLI.Не могли бы вы дать мне идею?

Родные классы C ++

class HeaderMessage {
    double timestamp;
    string ric_code;
}

class TradeMessage {
   double price;
   int size;
}

 class RFARecord
 {
public:
    RFARecord();
    HeaderMessage * hMsg;
    list<TradeMessage *> qMsgs;
 };

Мои классы C ++ / CLI выглядят так

    public ref class RFARecordRef
{
public:
    RFARecordRef();
    RFARecordRef(RFARecord *record);
    HeaderMessageRef hMsg;
    List<TradeMessageRef> tMsgs;
private:
    RFARecord *record;
};

    ref class HeaderMessageRef
    {
    private:
        HeaderMessage *hMsg;
    public:
        HeaderMessageRef(void);
    };

    ref class TradeMessageRef
    {
    private:
        TradeMessage *tMsg;
    public:
        TradeMessageRef(void);
    };

Яне уверен, что мой подход правильный.

Я читаю данные из текстового файла и передаю эти данные в виде RFARecords в мою программу на C #.

Как правильно обернуть или маршалировать вышеуказанные объекты данных в C ++ / CLI, которые затем могут быть использованы моей программой на C #.

Заранее спасибо.

С уважением,Alok

1 Ответ

1 голос
/ 04 января 2012

Если я правильно понимаю.Ваша самая большая задача - маршалинг строк из строк c ++ в объекты System :: String ^.

Что вы собираетесь сделать, это объявить метод в классе C ++ / CLI, который возвращает тип System :: String^ примерно так:

System::String^ get_str_from_cpp()
{
   std::string str = ptr_to_native_cpp_class->get_str();
   System::String^ ret_str = std_str2sys_str(str);
   return ret_str;
}

Метод std_str2sys_str выглядит следующим образом.

static System::String^ std_str2sys_str(std::string std_str)
{
   System::String^ sys_str = gcnew System::String(std_str.c_str());
   return sys_str;
}

Конечно, вы можете использовать char * to, если хотите.

TheПеременная "ptr_to_native_cpp_class" должна быть переменной класса, которая указывает на экземпляр вашего нативного класса c ++.Похоже, у вас уже есть такие.

Есть также способы маршалинга из System :: String ^ в std :: string или char *, которые находятся в сети.Надеюсь, этот пример поможет.Вам не нужно беспокоиться о маршалинге базовых типов, таких как int или bools, вы можете просто вернуть их прямо из слоя C ++ / CLI в C #.

Чтобы ответить на вопрос о маршалинге структуры в C ++/ CLI;Я не думаю, что есть способ автоматически распределить всю пользовательскую структуру, даже если она полностью состоит из базовых типов.Что я делаю в своем коде, так это просто пишу объект-обертку, у которого есть определенные методы get для каждого элемента данных, например:

//Native C++ class
class data_container
{
public:
   int var1;
   int var2;
}

//C++/CLI class
public ref class cli_data_container
{
public:
   get_var1() {return data_ptr->var1;}
   get_var2() {return data_ptr->var2;}
private:
   data_container* data_ptr;
};

Если есть автоматический способ сделать это, это было бы неплохо, но у нас былоПрошлым летом стажер сделал эти интерфейсы для нас для нескольких десятков служебных классов, и они выполнили свою работу.

...