C++/CLI:返回对非托管对象的引用
C++/CLI: return a reference to unmanaged object
我正在寻找一种方法来返回对作为托管对象成员的另一个对象的引用。这可以在C++中轻松实现,但对于 C++/CLI 包装器与 C# 一起使用来说是一个挑战。下面是可重现的场景(这是很多代码,但都非常简单,只是演示问题)
C++类:
class NATIVEAPI NativeSlave
{
public:
NativeSlave() : x_( 0 ), y_( 0.0 )
{}
NativeSlave( int x, double y ) : x_( x ), y_( y )
{}
int x_;
double y_;
};
class NATIVEAPI NativeMaster
{
public:
__declspec( property( get = getSlave, put = setSlave ) ) NativeSlave& slave;
NativeSlave& getSlave()
{
return *pSlave; //returns a reference
}
void setSlave( const NativeSlave& slave )
{
*pSlave = slave;
}
public:
NativeMaster() : pSlave( new NativeSlave( 4, 5.0 ) )
{}
~NativeMaster()
{
delete pSlave;
}
private:
NativeSlave* pSlave;
};
C++用法:
NativeSlave slave = NativeSlave( 1, 2.0 ); //now, slave.x==1, slave.y==2.0
NativeMaster master; //now, master.slave.x==4, master.slave.y==5.0
master.slave = slave; //now, master.slave.x==1, master.slave.y==2.0
master.slave.x_ = 6; //now, master.slave.x==6
master.slave.y_ = 10.0; //now, master.slave.y==10.0
因此,在C++中,我们可以轻松地获取对底层对象的引用并对其方法进行操作(在这里,成员是公共的以简化示例)。
然后,目标是将其包装在 C++/CLI 中,以实现与上述C++相同的 C# 功能(用法):
C#(所需):
ManagedSlave slave = new ManagedSlave(1, 2.0); //now, slave.x==1, slave.y==2.0
ManagedMaster master = new ManagedMaster(); //desired: master.slave.x==4, master.slave.y==5.0
master.slave = slave; //desired: master.slave.x==1, master.slave.y==2.0
master.slave.x = 6; //no appropriate get() method to change master.slave
master.slave.y = 10.0; //no appropriate get() method to change master.slave
这是编写包装器的尝试:
C++/CLI(在get/set属性方法中存在问题):
public ref class ManagedSlave
{
public:
property int x
{
int get()
{
return mSlave->x_;
}
void set( int x )
{
mSlave->x_ = x;
}
}
property double y
{
double get()
{
return mSlave->y_;
}
void set( double y )
{
mSlave->y_ = y;
}
}
public:
ManagedSlave( int x, double y ) : mSlave( new NativeSlave( x, y ) )
{}
~ManagedSlave()
{
delete mSlave;
}
internal:
NativeSlave* mSlave;
};
public ref class ManagedMaster
{
public:
property ManagedSlave^ slave
{
ManagedSlave^ get()
{
//??????????????????????????
};
void set( ManagedSlave^ slave )
{
//is this correct???????????
mMaster->slave.x_ = slave->x;
mMaster->slave.y_ = slave->y;
};
}
public:
ManagedMaster() : mMaster( new NativeMaster() )
{}
~ManagedMaster()
{
delete mMaster;
}
internal:
NativeMaster* mMaster;
};
.
NET "引用"与C++引用完全不同。
.NET 中有一些东西等效于C++引用,即限定参数的ref
关键字。 但是除了参数之外,没有办法将其用于任何事情。 (在 IL 级别,它也可以用于局部变量,但仍然不能用于返回类型)
大多数情况下,您可以通过额外的间接层来解决此问题。
在您的特定情况下,这非常简单:
ManagedSlave( NativeSlave* s ) : mSlave( s )
{}
~ManagedSlave()
{
// empty
}
ManagedSlave^ ManagedMaster::slave::get()
{
return gcnew ManagedSlave( &mMaster->getSlave() );
}
// remove ManagedMaster::slave::set
基本上,ManagedSlave
没有理由负责分配和释放NativeSlave
,因为NativeMaster
已经这样做了。
相关文章:
- 返回常量对象引用 (getter) 和仅返回字符串有什么区别?
- 我们可以有一个 setter 成员函数作为从 const 对象引用的 const 吗?
- C++对象引用返回不同的值
- 对象引用中的字段以不同的方法返回不同的值
- 通过向构造函数其他对象引用页面来创建对象
- 为什么在对象引用恒定时允许更改为另一个类的指针的成员变量
- 如何在C++中读取 HDF5 对象引用
- C++ 未定义的对象引用
- 从函数返回 libconfig 类设置对象引用
- qt vsaddin错误对象引用未设置为对象的istanse
- 在这种情况下,为什么使用 *此必需的对象引用返回对象引用
- 基本C - 构造contaning对象引用,并将其作为方法参数传递
- C :将对象引用作为参数给出错误:呼叫class :: function()的匹配函数
- C++OOP基础知识-是否正确返回对象引用
- 使用对象引用(可能)在调用destructor后使用对象引用
- 创建返回对象引用的成员函数的最简单方法
- 如何在C++上使用对象引用删除对象
- JNI/Android NDK-维护全局对象引用
- 为什么有些类方法返回"*this"(self的对象引用)?
- 在C++中返回伪对象引用的规则