无私人c ++

时间:2016-08-04 12:56:10

标签: c++ inheritance private-members

您好我需要访问DataContainer中的数据到Base类派生。 我不能公开这些数据,因为我在不应该访问它的地方使用这个类。

我可以只使用朋友但是我必须在Base类中为Derived类创建访问器。这将使其无法表达。

#include <vector>

class Data; // It's not important

class DataContainer
{
protected:
        std::vector<Data> dataVector;
        std::vector<Data> dataVector2;
};


class Base
{
protected:
    DataContainer* dataContainer;

public:
    virtual ~Base() {};

    void SetDataContainer(DataContainer* dataContainer)
    {
        this->dataContainer = dataContainer;
    }

    virtual void UseDataFromVector() = 0;
};

class Derived:public Base
{
public:
    virtual ~Derived() {};

    virtual void UseDataFromVector()
    {
        //And here want to use data from DataContainer...
    }

};

我的问题是如何在不公开或朋友的情况下访问这些数据。

更新

answer对我没有帮助,因为朋友不伤害我。我只是试图避免通过智能移动编写代码行。 我可以写这样的东西:

    class DataContainer
{
friend class Base
std::vector<Data> dataVector;
};

class Base
{
DataContainer* dataContainer;

std::vector<Data>& GetDataVector() { return dataContainer->dataVector;}
};

但是当我在DataContainer中添加更多向量时,我将不得不更新这个类。

2 个答案:

答案 0 :(得分:1)

我在测试代码中见过的最糟糕的黑客攻击是这样的:

#define private public
#include "the_class_i_want_to_hack.h"

// test case goes here, with instantiation of the hacked class and so on...

我显然不会推荐它......

答案 1 :(得分:0)

如果你知道Datacontainer的结构,你可能会滥用指针和指针算术

对于您的DataContainer,这将起作用:

virtual void UseDataFromVector()
{
    std::vector<Data>* pFirstDataContainer = reinterpret_cast<std::vector<Data>*>(dataContainer);
    pFirstDataContainer->emplace_back();
    pFirstDataContainer->size();

    std::vector<Data>* pSecondDataContainer = ++pFirstDataContainer;
    pSecondDataContainer->emplace_back();
    pSecondDataContainer->size();
 }