将指针变量限制为类和子类:受保护的方法不起作用

时间:2016-04-17 01:13:27

标签: c++ oop c++11

如何确保无法在类外传递/访问变量(指针)?

我知道明显的答案是使变量成为私有或受保护但代码是API的一部分,并且该类将由可以简单地创建公共get函数来克服该设计的用户进行子类化。 / p>

class Component
{
public:
    GUID gUid;

    template<typename T>
    T* addComponent()
    {
        T* cmp = new T();
        auto res = components.emplace(cmp->gUid, cmp);
        return cmp;
    }

protected:
    std::unordered_map<GUID, Component*> components;

};


class UpdaterComponent : public Component
{
public:

    void init()
    {
        nCmp = addComponent<NetworkComponent>(); // ok to store and access component within class
    }

    // Not ok to expose sub components to outside
    NetworkComponent* getNetworkComponent()
    {
        return nCmp;
    }

private:
    NetworkComponent* nCmp;
};

2 个答案:

答案 0 :(得分:2)

你提到,它将被用户子类化,你担心barparam = (c, len(d)) foo = Foo(a,b) foo.bar(*barparam) 函数会让他们访问指针。

在这种情况下:将其设为私有。这就是它的用途。 这也将禁止继承的类访问指针。

答案 1 :(得分:0)

访问控制可以防止错误,而不是恶意。

他们可以简单地复制/粘贴您的标题,在您的类定义中插入friend函数,包含其标题副本,然后根据需要绕过privateprotected规则

您可以隐藏pImpl类型模式后面的结构布局,但即使这样,他们也可以对布局进行反向工程并访问它。

除非硬件/操作系统支持加密内存,否则无法完成您的工作。