c ++中的自制列表

nia*_*r_q 4 c++ list

list.h

class Link {
public:
    string value;
    Link(const string& v, Link* p = 0, Link * s = 0):
        value(v), prev(p), succ(s) {}
    Link* insert(Link* n);              // insert n before this object
    Link* add(Link* n);                 // insert n after this object
    Link* erase();                      // remove this object from list
    Link* find(const string& s);        // find s in list
    Link* const find(const string& s) const;                       
    Link* advance(int n) ;                // get the nth successor 

    Link* next() const { return succ; }
    Link* previous() const { return prev; }

private:
    Link* prev;
    Link* succ;
};
Run Code Online (Sandbox Code Playgroud)

你能告诉我为什么我们需要两个版本的 find()

Link* find(const string& s);        // find s in list
Link* const find(const string& s) const;    
Run Code Online (Sandbox Code Playgroud)

在这个自制的双链表中,这两个版本之间的主要区别是什么?

Bar*_*rry 6

您想要同一个成员函数const的非const版本和非版本的原因是您可以在constconst对象上调用它们:

Link link = ...;
link.find("hello"); // calls non-const find(), returns Link*

const Link clink = ...;
clink.find("goodbye"); // calls find() const
Run Code Online (Sandbox Code Playgroud)

虽然,您的const版本返回Link* const.那是一个const指针Link.返回const Link*一个指向以下内容的指针会更有意义const Link:

Link* find(const std::string& );
const Link* find(const std::string& ) const;
Run Code Online (Sandbox Code Playgroud)

通过这种方式,您const Link仍然可以找到条目 - 只是不修改它们.这将保持const- 性.只要你不修改它们就能在const集合中查找东西是有意义的.