gpt4 book ai didi

c++ - 为读和写定义运算符 [ ]

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:15:05 24 4
gpt4 key购买 nike

在《The C++ Programming Language》一书中,作者给出了如下例子,并附上了几个陈述:

Defining an operator, such as [], to be used for both reading and writing is difficult where it is not acceptable simply to return a reference and let the user decide what to do with it.

Cref, is to help implement a subscript operator that distinguishes between reading and writing.

为什么[]很难定义什么时候同时用于读和写?Cref 类的定义如何帮助解决这个问题?

  class String{
struct Srep;
Srep *rep;

public:
class Cref;

// some definitions here
void check (int i) const { if (i<0 || rep->sz<=i) throw Range( );}

char read( int i) const {return rep->s[i];}
void write(int i, char c){ rep=rep->get_own_copy(); rep->s[i]=c;}

Cref operator[] (int i){ check(i); return Cref(*this, i);}
char operator[] (int i) const{check(i); return rep->s{i];}

}

class String::Cref{
friend class String;
String& s;
int i;
Cref(String& ss, int ii): s(ss),i(ii) {}
public:
operator char( ) { return s.read(i);}
void operator=(char c){s.write(i,c);}
};

最佳答案

如果你没有定义一个类 Cref 来解决这个问题,那么你必须做 std::map 做的事情:

template class <K,V> class map{
V& operator[](K const & key);
}

这将返回一个引用,该引用必须由有效的内存位置支持,因此

std::map<string,string> m;
m["foo"];
assert(m.find("foo") != m.end());

断言将成功(意思是,"foo" 现在是映射中的有效键)即使您从未将某些内容分配给 m["foo"]

您示例中的 Cref 类可以修复这种违反直觉的行为——它可以执行适当的逻辑来创建 m["foo"] 只有当您分配引用,并确保 m.find("foo") == m.end() 如果您在尝试读取不存在的 m["时没有执行某些赋值foo"].

同样,在您的 String 类中(这是一个引用计数的字符串——字符串共享它们的字符串数据,并且当您更改其数据与另一个字符串共享的字符串时,会创建一个新拷贝), 你必须在使用 operator[] 读取字符时复制一份。 Cref 类的使用,使您可以确保在使用 operator[] 写入时只制作一个拷贝。

关于c++ - 为读和写定义运算符 [ ],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5240994/

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