在C ++ / CLI包装器中访问私有C ++方法

时间:2015-03-13 18:53:45

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

鉴于C ++中的类方法必须是私有的,如何让C ++ / CLI访问它。示例:C ++类具有不应向外部用户公开的私有构造函数,C ++ / CLI托管代码必须具有类似的私有构造函数,但在内部它必须访问私有C ++构造函数以实例化引用C ++本机的成员指针类。

1 个答案:

答案 0 :(得分: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类中的sum方法protected。除了子类之外,其他所有内容都将无法访问私有成员。

静态工厂方法

你提到了一个私人构造函数;如果您需要管理构造,可以使用静态工厂方法来实现。例如:

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
    }
};

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