在 C++/CLI 包装器中访问私有 C++ 方法
Accessing private C++ methods within C++/CLI wrapper
鉴于 C++ 中的一个 class 方法必须在那里是私有的,如何让 C++/CLI 访问它。示例:C++ class 有一个不应该暴露给外部用户的私有构造函数,C++/CLI 托管代码必须有类似的私有构造函数,但在内部它必须访问私有 C++ 构造函数以实例化引用的成员指针C++ 本机 class.
请记住,首先,使事物不可访问(即私有)的目标通常与使事物可访问的目标相矛盾。如果您能够更改 class 声明,那么您还有一些选择。我不知道您的 C++/CLI 要求的具体细节,但也许这些选项之一可以满足您的需求。
受保护和继承
"outsider"、private
和 protected
成员同样无法访问。但是对于 subclass,private
仍然是私有的,而 protected
成员是可以访问的。您可以通过 subclassing 访问受保护的成员。这可能是对 class 的 "private" 成员进行单元测试的一种方法,而无需将其完全暴露给世界。
class A {
protected: // was private
int sum(int a, int b);
};
class TestA : public A {
public:
bool testSum(int expected, int a, int b) {
return expected == sum(a, b);
}
};
因此,通过 protected
和 subclassing,可以访问 class A 中的 protected
方法 sum
。除了 subclasses 之外,私有成员将无法访问其他所有内容。
静态工厂方法
您提到了私有构造函数;如果您需要管理构造,则可以使用静态工厂方法来完成。例如:
class Foobar {
private:
Foobar() { } // Don't let anyone just make one.
public:
static Foobar* Create() { return new Foobar; }
};
// To create a Foobar instance:
Foobar* pfoo = Foobar::Create();
这不是最好的界面(例如,最好使用 shared_ptr
),但它表明了我的意思。请注意,由于工厂函数 Create
是 public,因此任何人都可以创建一个。但是,您可以将 Create
的主体更改为更复杂的内容:包括簿记、初始化等。工厂方法是一种管理创建的方式,而不是限制它。当然,您可能不想要这个,但如果您需要管理施工,这是一个选择。
好友
C++ 允许通过 friend
关键字将 classes 的私有部分访问给其他 classes/functions。
class A {
int x; //private
friend class B;
};
class B {
void foobar(A& a) {
a.x = 42; // permissible, because A declared class B a friend
}
};
友谊可以授予另一个 class 或一项职能。这很容易破坏封装并使代码难以遵循或保持安全,但它也为您提供了将私有成员公开给需要它的人的方法。
鉴于 C++ 中的一个 class 方法必须在那里是私有的,如何让 C++/CLI 访问它。示例:C++ class 有一个不应该暴露给外部用户的私有构造函数,C++/CLI 托管代码必须有类似的私有构造函数,但在内部它必须访问私有 C++ 构造函数以实例化引用的成员指针C++ 本机 class.
请记住,首先,使事物不可访问(即私有)的目标通常与使事物可访问的目标相矛盾。如果您能够更改 class 声明,那么您还有一些选择。我不知道您的 C++/CLI 要求的具体细节,但也许这些选项之一可以满足您的需求。
受保护和继承
"outsider"、private
和 protected
成员同样无法访问。但是对于 subclass,private
仍然是私有的,而 protected
成员是可以访问的。您可以通过 subclassing 访问受保护的成员。这可能是对 class 的 "private" 成员进行单元测试的一种方法,而无需将其完全暴露给世界。
class A {
protected: // was private
int sum(int a, int b);
};
class TestA : public A {
public:
bool testSum(int expected, int a, int b) {
return expected == sum(a, b);
}
};
因此,通过 protected
和 subclassing,可以访问 class A 中的 protected
方法 sum
。除了 subclasses 之外,私有成员将无法访问其他所有内容。
静态工厂方法
您提到了私有构造函数;如果您需要管理构造,则可以使用静态工厂方法来完成。例如:
class Foobar {
private:
Foobar() { } // Don't let anyone just make one.
public:
static Foobar* Create() { return new Foobar; }
};
// To create a Foobar instance:
Foobar* pfoo = Foobar::Create();
这不是最好的界面(例如,最好使用 shared_ptr
),但它表明了我的意思。请注意,由于工厂函数 Create
是 public,因此任何人都可以创建一个。但是,您可以将 Create
的主体更改为更复杂的内容:包括簿记、初始化等。工厂方法是一种管理创建的方式,而不是限制它。当然,您可能不想要这个,但如果您需要管理施工,这是一个选择。
好友
C++ 允许通过 friend
关键字将 classes 的私有部分访问给其他 classes/functions。
class A {
int x; //private
friend class B;
};
class B {
void foobar(A& a) {
a.x = 42; // permissible, because A declared class B a friend
}
};
友谊可以授予另一个 class 或一项职能。这很容易破坏封装并使代码难以遵循或保持安全,但它也为您提供了将私有成员公开给需要它的人的方法。