如何使C++类以 const 方式访问另一个类的所有私有成员(仅读取而不写入)



我正在制作一个游戏,其中我有一个Level类,用于将所有对象存储在向量中并更改它们。

我还有另一个类,叫做Engine.h,它有静态函数,可以根据Level拥有的向量来计算东西,但不会改变其中的任何内容。Level调用引擎函数,并根据返回的内容执行操作。

但是,由于Engine需要查看Level拥有的向量,我被迫向每个Engine函数传递一组向量指针(const),以便它可以根据向量的当前状态进行计算。

有没有什么方法可以让Engine只访问Level的所有成员变量,但不能编辑其中的任何一个。某种"const friend"?

我刚刚意识到有一个对象级别。因此,我还需要有一种方法来为Engine分配一个级别的特定对象,它可以与该对象成为"constfriend"。也许这变得复杂了。如果没有解决方案,那么将大量成员变量传递给Engine函数是一种糟糕的做法,还是这样做。传递一个指向Level的const指针(这会使Level的所有成员变量也变为const吗?)

假设您有一个类Foo,它有一个要访问的成员变量x。您可以制作const函数,这些函数按值访问成员变量。由于它们是const,因此它们可能不会修改任何成员变量。

class Foo
{
public:
    Foo() : x{0} {}  // constructor
    int   getX() const       { return x; }   // this is a "getter"
    void  setX(int value)    { x = value; }  // this is a "setter"
private:
    int x;
};

然后你就可以上另一节课Bar了。也许在某些函数中,它需要访问Foox变量,您可以使用getter。

class Bar
{
    void doStuff (Foo a)
    {
        int answer = a.getX();
        std::cout << answer << std::endl;
    }
};

现在我们可以看一个快速演示。我们做了一个Foo的实例和一个Bar的实例。然后,我们可以为Foo设置x值,并从BardoStuff函数访问它。

int main()
{
    Bar myBar;
    Foo myFoo;
    myFoo.setX(5);
    myBar.doStuff(myFoo);  // will output 5
    return 0;   
}

如果有帮助,你可以做这样的事情:

class Level
{
private:
    std::vector<float> stuff;
public:
    // give outsiders const access
    const std::vector<float>& const_stuff = stuff; // c++11 else use ctor
    const std::vector<float>& get_stuff() const { return stuff; } // more idiomatic
};

最新更新