gpt4 book ai didi

c# - 在 C# 中使用具有另一个 C++ 类对象的 C++ 类

转载 作者:行者123 更新时间:2023-11-28 07:34:28 25 4
gpt4 key购买 nike

我为自己创建了一个小演示来练习结合使用 C++ 和 C#(对我来说这是一项非常理想的技能)。
它看起来像这样:

Class Diagram

问题是因为类 Person 有一个类型为 Name 的成员。
将这些类公开给 C# 的正确方法是什么?

例如,我将如何公开这个构造函数:

    Person(Name name);

这有点难以解释,但问题是这个 Person 构造函数接受一个原生的 Name 对象,我无法在 C# 中创建这个原生对象然后将它传递给构造函数,对吗?它甚至是不可取的。
即使我为它编写了一个包装器(比如 ManagedName),我也无法将它传递给 Person,因为没有可接受的构造函数。

我该如何应对这种情况?

这里是请求的标题:

可为空:http://pastebin.com/z7zTCrAq
姓名:http://pastebin.com/ALNp5c1a
人:http://pastebin.com/nkWyUv9C

最佳答案

这是一种方法 (C++/CLI)


class Name {
public:
std::string firstName;
std::string middleName;
std::string lastName;
};
ref class ManagedName {
internal:
Name* nameptr;
public:

ManagedName() {
nameptr = new Name();
}
ManagedName(System::IntPtr ptr) {
nameptr = (Name*)(void*)ptr;
}
property System::String^ firstName {
System::String^ get() {
return gcnew System::String(nameptr->firstName.data());
}
void set(System::String^ val) {
System::IntPtr strptr = System::Runtime::InteropServices::Marshal::StringToBSTR(val);
nameptr->firstName = (char*)(void*)strptr;
System::Runtime::InteropServices::Marshal::FreeBSTR(strptr);
}
};
property System::String^ middleName {
System::String^ get() {
return gcnew System::String(nameptr->middleName.data());
}
void set(System::String^ val) {
System::IntPtr strptr = System::Runtime::InteropServices::Marshal::StringToBSTR(val);
nameptr->middleName = (char*)(void*)strptr;
System::Runtime::InteropServices::Marshal::FreeBSTR(strptr);
}
};
property System::String^ lastName {
System::String^ get() {
return gcnew System::String(nameptr->lastName.data());
}
void set(System::String^ val) {
System::IntPtr strptr = System::Runtime::InteropServices::Marshal::StringToBSTR(val);
nameptr->lastName = (char*)(void*)strptr;
System::Runtime::InteropServices::Marshal::FreeBSTR(strptr);
}
};
};
class Person {
public:
Name* name;
std::string birthday;
Person(Name* name) {
this->name = name;
}
};
ref class ManagedPerson {
public:
ManagedPerson(ManagedName^ name) {
//create an instance of the native class
personPtr = new Person(name->nameptr);

}
property System::String^ Birthday {
System::String^ get() {
return gcnew System::String(personPtr->birthday.data());
}

};
property ManagedName^ Name {
ManagedName^ get() {
return gcnew ManagedName(System::IntPtr(personPtr->name));
}
};
private:
Person* personPtr;
};

关于c# - 在 C# 中使用具有另一个 C++ 类对象的 C++ 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17016196/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com