C#调用C++类时,结构体属性如何访问

happymouth 2015-10-17 02:53:41
在C++中设计了2个结构和2个类,如下:
namespace StructTrans {
public ref struct info
{
double dMax;
};
public ref struct baseStruct
{
int iMax;
String ^ strMax;
};
public ref struct lev1Struct : public baseStruct
{
public:
info infoMax;
};
public ref class Class1
{
// TODO: 在此处添加此类的方法。
public:
baseStruct m_data;
public:
Class1(){}
~Class1(){}
virtual void set() { m_data.iMax = 0; m_data.strMax = "aaa";}
};
public ref class Class2 : public Class1
{
public:
lev1Struct m_data;
public:
Class2(){}
~Class2(){}
virtual void set() override {m_data.iMax = 1; m_data.strMax = "bbb"; m_data.infoMax.dMax = 1.0;}
};
}

然后在C#Windows窗体工程中创建新类,如下:
    public class Class3 : Class1
{
public override void set() { m_data.iMax = 2; m_data.strMax = "ccc"; }
}
public class Class4 : Class2
{
public override void set() { m_data.iMax = 3; m_data.strMax = "ddd"; m_data.infoMax.dMax = 4.0; }
}

并在按钮单击事件中执行如下代码:
{
Class1 c1 = new Class1();
c1.set();
string str = string.Format("base class Class1 : iMax = {0}, strMax = {1}\n", c1.m_data!.iMax, c1.m_data!.strMax);

Class2 c2 = new Class2();
c2.set();
str += string.Format("base class Class2 : iMax = {0}, strMax = {1}, info.dMax = {2}\n", c2.m_data.iMax, c2.m_data.strMax, c2.m_data.infoMax.dMax);

Class1 c3 = new Class3();
c3.set();
str += string.Format("base class Class3 : iMax = {0}, strMax = {1}\n", c3.m_data.iMax, c3.m_data.strMax);

Class2 c4 = new Class4();
c4.set();
str += string.Format("base class Class4 : iMax = {0}, strMax = {1}, info.dMax = {2}\n", c4.m_data.iMax, c4.m_data.strMax, c4.m_data.infoMax.dMax);

MessageBox.Show(str);
}

提示错误信息
“错误 1 现用语言不支持“StructTrans.Class1.m_data” C:\Works\C++ Project\StructTrans\StructTransTest\Form1.cs 24 93 StructTransTest”

请问,如何在C#中能够正确方位C++类中的结构体属性?
...全文
243 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
CyberLogix 2015-10-17
  • 打赏
  • 举报
回复
handle定义
happymouth 2015-10-17
  • 打赏
  • 举报
回复
非常感谢,在lev1Struct中键入handle定义,并添加构造函数,如下:
	public ref struct lev1Struct : public baseStruct
	{
		info ^infoMax;
		lev1Struct() { infoMax = gcnew info();}
	};
Class2和Class4均能正确使用。
iyomumx 2015-10-17
  • 打赏
  • 举报
回复
如果你坚持要使用ref,那么所有出现该类型的地方都应该为handle 比如 info^ infoMax;
happymouth 2015-10-17
  • 打赏
  • 举报
回复
问题解决一半,在C++中将属性m_data设置为baseStruct ^类型,在Class1的构造函数中添加对m_data的初始化,并重写set函数为指针类型引用,代码分别如下:
	public:
		baseStruct ^m_data;
	public:
		Class1(){m_data = gcnew baseStruct();}
               ......
                virtual void set() { m_data->iMax = 0; m_data->strMax = "aaa";}
则,在C#中调用c1和c3的m_data属性,均可正确获取数据。 但对于派生类Class2中由baseStruct派生的lev1Struct类型数据m_data,如果也采用上述方法,如下:
	public:
		lev1Struct ^m_data;
	public:
		Class2(){m_data = gcnew lev1Struct();}
		~Class2(){}
		virtual void set() override {m_data->iMax = 1; m_data->strMax = "bbb"; m_data->infoMax.dMax = 1.0;}
则会提示infoMax无法访问。 需要怎么才能如m_data中的其他元素一样访问m_data.infoMax下的dMax?
happymouth 2015-10-17
  • 打赏
  • 举报
回复
有此应用的原因是,本人在C#中对一个非托管C++ dll进行调用时遇上,只能通过托管C++进行封装,一般的类函数均可以正常调用,但是C++中的结构属性总是无法获取正确的值,故编写了上述代码。 我只是想能够正常访问C++类中的结构属性,根据楼上建议,如果将C++中的struct写成value类型,则 lev1Struct 无法从baseStruct继承。
iyomumx 2015-10-17
  • 打赏
  • 举报
回复
记住C++里struct和class只有默认访问限制的区别 C++/CLI里ref struct和ref class也一样。 要表达C#中的struct,用value struct

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧