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.
之外进行编辑
当我使用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.
之外进行编辑