访问受保护的成员

时间:2017-04-05 16:09:35

标签: c++ c++11

我是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函数,它似乎将图层添加到堆栈......但也许它没有正确引用向量。任何人都可以提供一些指导,说明为什么会这样吗?

2 个答案:

答案 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()
  1. 为了便于编辑,您的vector<Layer*> _layers; 函数不得将const-ref返回到_layers向量。将其更改为getLayers()

  2. 最后,std::vector& getLayers();创建 std::vector layerStack = Stack::getLayers();返回的向量的COPY。将其更改为getLayers()