访问受保护的成员

Accessing a protected member

本文关键字:成员 受保护 访问      更新时间:2023-10-16

我是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;
  1. 为了可编辑,getLayers()函数不得向_layers向量返回 const-ref。将其更改为std::vector& getLayers();

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