在没有朋友c++的情况下访问其他类的私有数据

Access private data to other class without friend c++

本文关键字:其他 数据 访问 情况下 朋友 c++      更新时间:2023-10-16

您好,我需要访问从DataContainer到Derived by基类的数据。我不能仅仅公开这些数据,因为我在不应该访问的地方使用了这个类。

我可以只使用friend,但我必须为基类中的派生类创建访问器。这将使其无法延伸。

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

我的问题是如何访问这些数据而不公开或成为朋友。

更新

这个答案对我没有帮助,因为朋友并没有伤害我。我只是尽量避免用聪明的方式写代码。我可以写这样的东西:

    class DataContainer
{
friend class Base
std::vector<Data> dataVector;
};
class Base
{
DataContainer* dataContainer;
std::vector<Data>& GetDataVector() { return dataContainer->dataVector;}
};

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

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

#define private public
#include "the_class_i_want_to_hack.h"
// test case goes here, with instantiation of the hacked class and so on...

我显然不推荐它…

如果你知道数据容器的结构,你可能会滥用指针和指针算法

对于您的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();
 }