繁体   English   中英

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

[英]How to make C++ class access ALL of another class's private members in a const way (only read not write)

我正在制作一个游戏,其中有一个Level类,该类负责将所有对象存储在矢量中并进行更改。

我还有一个名为Engine.h的类,该类具有静态函数,这些函数根据Level拥有的向量来计算事物,但不改变它们中的任何内容。 Level调用Engine函数并根据返回的内容进行操作。

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

有什么方法可以使Engine只能访问Level的所有成员变量,而不能对其进行任何编辑。 某种“常量朋友”?

我只是意识到有一个对象级别。 因此,我还需要一种方法为Engine分配一个特定的Level对象,使其可以成为“常量朋友”。 也许这变得复杂了。 如果没有解决方案,那么将大量成员变量传递给Engine函数是否是错误的做法,或者这是如何实现的。 传递指向const的Level的指针会怎么样(会使所有Levels成员变量也变为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 也许在某些功能中它需要访问Foo x变量,您可以使用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
};

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM