class访问控制:如果有readonly访问控制器怎么办?

class access control: What if there is readonly access controller?

当我使用class时,我发现一些属性,尤其是布尔值的属性,经常被其他实例读取。例如,

class Node{
private:
    int item;
    bool visited;
public:
    bool isVisited(){return visited;}
    void bar(){
        ...
        visited=true;
        ...
    }
};

class Graph{
private:
    vector<Node> nodes;
public:
    void bar(int idx){
        if(nodes[idx].isVidited()){
            ...
            nodes[idx].foo();
            ...
        }
    }
}

在这种情况下,如果仅通过 class 节点的方法更改访问,则从读取的角度来看,所访问属性的访问控制器不应始终是私有的。如果有一个门禁控制器 'readonly' 是打开读,关闭写呢?我认为这在定义状态属性时很有用。会不会有副作用?

您是否尝试过在节点 class 中将图表 class 标记为 friend

这有助于通过图表 class 访问节点 class 的私有成员。

在某些语言中,getter/setter 用作私有值的 api。 它看起来像一个 public 值,但在内部方法控制私有成员变量,而不是带有 '=' 运算符本身的代码。

//TYPESCRIPT
class Foo{
    private _name:string
    constructor(n:string){this._name=n}

    get name(){return this._name}
    //set name(n:string){this._name=n}
}

const foo=new Foo('Jack jack')
console.log(foo.name)  //[LOG]: "Jack jack"

foo.name='hudson'  //[ERR]: Cannot set property name of #<Foo> which has only a getter 

上面的代码显示了如何设置只读 属性。只有一个 getter 传递了与私有成员变量 '_name' 完全相同的值,但是由于 setter 没有定义,所以只有 class 本身可以改变这个值而不是能够从 class.

之外进行编辑