访问受保护的成员
Accessing a protected member
我是C++新手,正在努力与私人成员建立一个适当的类并访问它们。基本上,我有一个构成堆栈的层向量。 我想创建一个简单的函数,它只是在堆栈中添加一层。 我试图简化这个例子来解释我的问题。
// Stack.h
namespace NS {
class Stack
{
public:
Stack() {
}
virtual ~Stack() {
}
std::vector<Layer> const &getLayers() const;
virtual Layer* AddLayer(TextureBase texture);
protected:
std::vector<Layer> _layers;
}
这是我的cpp文件
//Stack.cpp
namespace NS {
std::vector<Layer> const &Stack::getLayers() const {
return _layers;
}
Layer* Stack::AddLayer(TextureBase texture) {
Layer* newLayer = new Layer();
newLayer->setTexture(texture);
std::vector<Layer> layerStack = Stack::getLayers();
layerStack.push_back(*newLayer);
return newLayer;
}
}
在我的主文件中,我创建了堆栈,然后尝试像这样添加层:
auto myStack = getStack();
myStack->AddLayer(myTexture);
但是,当我在此行之后放置断点时,myStack 不包含任何层(大小为 0(。 我可以逐步完成 AddLayer 函数,它似乎确实将图层添加到堆栈中......但也许它没有正确引用向量。 任何人都可以就为什么会发生这种情况提供一些指导吗?
问题是layerStack
是_layers
的本地副本:
std::vector<Layer> layerStack = Stack::getLayers();
您正在将新图层推送到此本地副本,而不是数据成员。您需要改为引用数据成员:
std::vector<Layer>& layerStack = Stack::getLayers();
唉,这不会编译,因为您的getLayers
函数返回一个const
引用。您需要添加一个非const
对应项:
std::vector<Layer>& getLayers();
您必须解决 3 个问题。
1. Layer* newLayer = new Layer()
将动态分配一个 Layer 对象,但是当您将其插入矢量时,您会取消引用它,因此您最终会对 Layer
对象的 COPY 执行push_back
。你可以只使用Layer newLayer = Layer()
,或者如果我正确理解你的意图,一个层指针的向量:
vector<Layer*> _layers;
为了可编辑,
getLayers()
函数不得向_layers向量返回 const-ref。将其更改为std::vector& getLayers();
最后,
std::vector layerStack = Stack::getLayers();
创建由getLayers()
返回的向量的 COPY 。将其更改为std::vector& layerStack = Stack::getLayers()
- C++:无法访问声明的受保护成员
- 继承和友元函数,从基类访问受保护的成员
- 为什么派生类的好友不能使用受保护的成员?
- 相同的层次结构,访问基类的受保护成员时的行为不同
- 从模板化父类中的派生内部类访问受保护的成员变量
- 在使用受保护和继承时无法访问在类中声明的私有成员
- 同一模板类但模板类型的受保护成员
- 派生类无法访问基类的受保护成员
- 继承期间受保护成员的皮条
- 访问说明符(私有/公共/受保护)如何在内部工作(限制成员访问)?
- 如何将超类的受保护成员访问到其派生类. 如果已在派生类中声明了具有相同名称的函数?
- 是否可以基于私有/受保护成员分配类枚举?
- 依赖模板基础的受保护成员
- 将派生类构造函数参数传递给受保护的成员
- 无法从派生类型的作用域访问另一个实例的受保护成员
- 为什么我无法使用受保护/私有继承访问派生实例中基类的受保护成员?
- 将对象强制转换为派生类以访问父类的受保护成员
- 使从一个基类派生的类能够使用继承的受保护成员
- 无法访问派生类函数内的基类的受保护数据成员
- 派生类如何使用基类的受保护成员