假设我有一个看起来像这样的c ++非托管类
#include "note.h"
class chord
{
private:
note* _root; // or, as in my real class: std::shared_ptr<note> _root;
// _third, _fifth, _seventh, etc
public:
someClass(const note n1, const note n2, const note n3); // constructor takes some of these notes to make a chord
std::shared_ptr<note> root() const; // returns ptr to root of the chord
std::string name() const; // returns the name of this chord
}
现在,我知道我需要将这两个类包装到cli中的托管类中。但问题是,如何将指向本机类的私有指针传递给构造函数?
就目前而言,Note * _src在noteWrapper中是私有的。但原生Chord()需要本机Note对象。所以chordWrapper无法访问noteWrappers _src,传递给构造函数。如何在不将内部成员暴露给.net的情况下完成此任务?
编辑**
// assume noteWrapper is already defined, with Note* _src as private
public ref class chordWrapper
{
private:
Chord* _src;
public:
chordWrapper(noteWrapper^ n1, noteWrapper^ n2, noteWrapper^ n3)
{
_src = new Chord(*n1->_src, *n2->_src, *n2->_src); // _src is inaccessible
}
}
以上是不可能的,因为chordWrapper无法访问该内部成员。由于朋友也不受支持,我不知道我还能做些什么来隐藏.net中的内部成员,并将它们暴露给cli类。
处理此问题的适当方法是什么?
答案 0 :(得分:4)
内部成员与C ++ / CLI中的私有成员属于同一范围。它与C#内部修饰符相同。恕我直言,我认为没有可见性修饰符的类/结构将默认解释为内部?
public ref class noteWrapper
{
Note* _src;
}
与
的范围相同public ref class noteWrapper
{
private:
Note* _src;
}
但
public ref class noteWrapper
{
internal:
Note* _src;
}
是另一个与cli库共享的私有成员
答案 1 :(得分:3)
您可以使用'internal'关键字仅与cli库共享,而不是.Net客户端。 e.g。
public ref class noteWrapper
{
internal:
Note* _src;
}