您好我需要访问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中添加更多向量时,我将不得不更新这个类。
答案 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();
}