【问题标题】:Accessing private C++ methods within C++/CLI wrapper在 C++/CLI 包装器中访问私有 C++ 方法
【发布时间】:2015-03-13 18:53:44
【问题描述】:

给定 C++ 中必须是私有的类方法,如何让 C++/CLI 访问它。示例:C++ 类有一个不应暴露给外部用户的私有构造函数,C++/CLI 托管代码必须有类似的私有构造函数,但在内部它必须访问私有 C++ 构造函数来实例化一个引用 C++ 本机类的成员指针。

【问题讨论】:

  • 你能编辑 C++ 类吗?你能添加一个公共静态工厂方法吗?
  • 这一点没有什么意义,使用您的包装器的代码已经无法访问 C++ 构造函数。将其公开需要#pragma make_public hack,您绝不会意外使用它。
  • @MatthewMoss - 是的,我拥有 C++ 类并且可以进行更改。你能扩展你的建议吗?
  • @HansPassant,对,这就是消费者(C++ 和 C#)不能使用 ctor 的想法。但是 CLI 必须在内部使用它

标签: c++ c++-cli private


【解决方案1】:

请记住,首先,使事物不可访问(即私有)的目标通常与使事物可访问的目标相矛盾。如果您能够更改类声明,那么您有一些选择。我不知道您的 C++/CLI 要求的具体细节,但也许这些选项之一可以满足您的需求。

受保护和继承

对于“局外人”,privateprotected 成员同样无法访问。但是对于子类,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
    }
};

友谊可以授予另一个类或函数。这很容易破坏封装并使代码难以遵循或保持安全,但它也为您提供了将私有成员公开给需要它的人的方法。

【讨论】:

  • 谢谢,接受工厂,因为其他两个不适用于所描述的场景(使用托管 C++/CLI 包装原生 C++)
猜你喜欢
  • 2015-09-13
  • 2011-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-29
  • 1970-01-01
  • 2010-10-26
  • 1970-01-01
相关资源
最近更新 更多