首先说下什么是我所谓的连续调用,假设有一个类person:
person a; a.set("kangzj").get().set("abc"); |
加红的部分即为本文要说的连续调用。
怎么实现呢,很简单,只要让成员函数返回一个指向当前对象的引用即可,于是,我这样定义这个类:
class person{ private: string name; public: const person& get() const; person& set(string n); }; const person& person::get(){ cout<<name; return *this; } person& person::set(string t){ name=t; return *this; } |
Ok,可以使用了。这样的句子还是编译不会成功:
a.set("kangzj").get().set("abitno"); |
因为调用const型成员函数的this指针是const型,指向的对象也是const型,无法改变对象的成员变量。也就是说没法执行set操作,而出错。
怎样来解决这个问题呢?把get()重载,在单独调用get的时候调用const型的方法,在连续调用的时候调用非const的方法(当然都是自动的),基于这种思想可以这样来设计类(下面代码可以直接编译运行):
#include <iostream> #include <string> using namespace std; class person{ private: string name; public: const person& get() const; person& get(); person& set(string n); }; const person& person::get() const{ cout<<name<<" -constn"; return *this; } person& person::get(){ cout<<name<<" -not constn"; return *this; } person& person::set(string t){ name=t; return *this; } int main() { person a; a.set("kangzj").get().set("ddd").get(); a.get(); const person b; b.get(); } |
全文完,欢迎讨论。
参考资料:《C++ Primer(第三版)》
Leave a Reply