我是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函数,它似乎将图层添加到堆栈......但也许它没有正确引用向量。任何人都可以提供一些指导,说明为什么会这样吗?
答案 0 :(得分:2)
问题是layerStack
是_layers
的本地副本:
std::vector<Layer> layerStack = Stack::getLayers();
您正在将新图层推送到此本地副本,而不是数据成员。您需要改为引用您的数据成员:
std::vector<Layer>& layerStack = Stack::getLayers();
唉,这不会编译,因为你的getLayers
函数会返回const
引用。您需要添加非const
对应项:
std::vector<Layer>& getLayers();
答案 1 :(得分:0)
您必须解决3个问题。
1. Layer* newLayer = new Layer()
会动态分配一个Layer对象,但是当你将它插入到vector中时,你会取消引用它,所以你最终会对{{1}的COPY进行push_back
对象。您可以刚刚使用Layer
,或者如果我正确理解了您的意图是图层指针的向量:
Layer newLayer = Layer()
为了便于编辑,您的vector<Layer*> _layers;
函数不得将const-ref返回到_layers向量。将其更改为getLayers()
最后,std::vector& getLayers();
创建 std::vector layerStack = Stack::getLayers();
返回的向量的COPY。将其更改为getLayers()