gpt4 book ai didi

struct - D(2) 编程 : chaining functions call on struct

转载 作者:行者123 更新时间:2023-12-01 23:44:52 24 4
gpt4 key购买 nike

我的结构似乎被破坏了,我不明白为什么:

struct FilterBoundary {

private uint start;
private uint end;

public static immutable uint MIN = 0;
public static immutable uint MAX = uint.max;

public this(uint start=0, uint end=0){
checkRange(start,end);
this.start=start;
this.end=end;
}

public uint getStart(){
return this.start;
}

public uint getEnd(){
return this.end;
}

private void checkRange(uint start, uint end){
if(start>end){
throw new Exception("Invalid range.");
}
}

public FilterBoundary setStart(uint start){
checkRange(start,this.end);
this.start=start;
return this;
}

public FilterBoundary setEnd(uint end){
checkRange(this.start,end);
this.end=end;
return this;
}
}

这段代码

auto r1 = FilterBoundary(6, 7);

//Correct
writeln(r1);

r1.setStart(5);
//Correct
writeln(r1);

//Wrong end set to 9 but start stays to 5
r1.setEnd(9).setStart(2);
writeln(r1);

产生这个输出:

FilterBoundary(6, 7) 
FilterBoundary(5, 7)
FilterBoundary(5, 9)

最佳答案

结构是值类型:当setStartsetEnd 返回this 时,它们实际上是返回结构的副本。因此,第二个 setStart 调用对临时副本进行操作,该副本被丢弃。

您可以通过返回 &this(并将返回值适本地更改为 FilterBoundary*)来解决这个问题。请注意,这可能是不安全的:因为结构可以存在于堆栈中,保存指向它的指针可能会导致它成为悬空指针,并且访问它会破坏内存。

关于struct - D(2) 编程 : chaining functions call on struct,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29892557/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com