访问 C++/CLI 包装器中的私有C++方法
Accessing private C++ methods within C++/CLI wrapper
给定C++中必须私有的类方法,如何使C++/CLI 访问它。示例:C++类具有不应向外部用户公开的私有构造函数,C++/CLI 托管代码必须具有类似的私有构造函数,但在内部它必须访问私有C++构造函数以实例化引用本机类的成员指针C++。
请记住,首先,使事物不可访问(即私有)的目标通常与使事物可访问的目标相矛盾。如果您能够更改类声明,那么您有一些选择。我不知道您的 C++/CLI 要求的具体细节,但也许其中一个选项会为您提供所需的内容。
受保护和继承
对于"局外人"来说,private
和protected
成员同样无法接近。但对于子类来说,private
仍然是私有的,而protected
成员是可访问的。可以通过子类化来访问受保护的成员。这可以是单元测试类的"私有"成员而不将其完全暴露给世界的一种方法。
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
和子类化,可以访问类 A 中protected
方法sum
。私有成员将保持对除子类以外的其他所有内容的访问权限。
静态工厂法
您提到了一个私有构造函数;如果您需要管理构造,则可以使用静态工厂方法完成。例如:
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
是公共的,因此任何人都可以创建一个。但是,您可以将Create
正文更改为更复杂的内容:包括簿记、初始化等。工厂方法是一种管理创建的方法,而不是限制创建。当然,您可能不希望这样做,但如果您需要管理施工,这是一种选择。
朋友
C++允许通过 friend
关键字将类的私有部分访问到其他类/函数。
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
}
};
友谊可以授予另一个类或一个函数。这很容易破坏封装,使代码难以遵循或保持安全,但它也为您提供了将私有成员完全暴露给需要它的人的方法。
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 通过方法访问结构
- 最小硬币更换问题(自上而下方法)
- C++为构建时间获取QDateTime的可靠方法
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 处理多个异常集合的C++方法
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 有什么方法可以遍历结构吗
- 当类在C++中定义时,有什么方法可以"register"类吗?
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- 使用std::函数映射对象方法
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- C++从另一个类访问公共静态向量的正确方法是什么
- C++优先级队列,按对象的唯一指针的特定方法升序排列
- 没有为自己的结构调用列表推回方法
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- 在类定义之后定义一个私有方法
- 枚举环境变量的惯用C++14/C++17方法
- 初始化具有非默认构造函数的std::数组项的更好方法