C++中无需额外变量向setter方法传递用户输入数据的方法有哪些?
首先直接回答你的问题:可以直接向setter传递用户输入值,不需要单独声明临时变量,以下是几种不同场景的实现方案,你可以根据自己的需求选择:
方案1:匿名lambda表达式直接调用(C++11及以上版本支持)
如果只是想省掉单独的临时变量声明,可以用匿名函数执行后直接返回输入值传给setter,写法如下:
#include <iostream> using namespace std; // 类定义和之前一致 class Square { private: double length; public: void setLength(double l) { length = l; } double getlength() { return length; } double calcArea() { return length * length; } }; int main() { Square s1; cout << "Enter length: "; // 直接将lambda的返回值传给setter,不需要额外声明变量x s1.setLength( []{ double t; cin >> t; return t; }() ); return 0; }
这个方案的优势是写法简单,不需要额外封装函数;缺点是不方便做输入合法性校验,出错后排查成本高,适合简单的演示场景使用。
方案2:封装通用输入工具函数(更推荐工程场景使用)
你可以把读入指定类型数据的逻辑封装成独立的工具函数,同时在函数内完成输入合法性校验,既可以省去临时变量声明,也能提升代码复用性:
#include <iostream> #include <string> #include <limits> using namespace std; // 通用double类型输入函数,支持自定义提示语和合法性校验 double inputDouble(const string& prompt) { double val; cout << prompt; cin >> val; // 校验输入是否合法,这里以正方形边长必须为正数为例 while (cin.fail() || val <= 0) { cin.clear(); // 清除输入流的错误状态 // 清空输入缓冲区中剩余的非法内容 cin.ignore(numeric_limits<streamsize>::max(), '\n'); cout << "输入不合法,请输入正数:"; cin >> val; } return val; } // 类定义和之前一致 class Square { private: double length; public: void setLength(double l) { length = l; } double getlength() { return length; } double calcArea() { return length * length; } }; int main() { Square s1; // 直接调用输入函数,返回值传给setter s1.setLength(inputDouble("Enter length: ")); return 0; }
这个方案的优势是复用性高,输入逻辑统一维护,校验逻辑不会散落在业务代码里,适合需要多次读入同类型数据的场景。
方案3:给类增加专属输入成员函数(面向对象设计更优)
如果输入边长是Square类的专属操作,可以把输入逻辑内聚到类内部作为成员方法,代码可读性更高:
#include <iostream> #include <limits> using namespace std; class Square { private: double length; public: void setLength(double l) { length = l; } double getlength() { return length; } double calcArea() { return length * length; } // 新增边长输入方法,内部处理输入和校验逻辑 void inputLength() { double l; cout << "Enter length: "; cin >> l; while (cin.fail() || l <= 0) { cin.clear(); cin.ignore(numeric_limits<streamsize>::max(), '\n'); cout << "边长必须为正数,请重新输入:"; cin >> l; } length = l; } }; int main() { Square s1; // 直接调用类的输入方法即可,不需要额外调用setter s1.inputLength(); return 0; }
额外说明
你原本用临时变量传递的写法完全是合法且合理的,尤其对于新手来说,显式声明的临时变量更方便调试(比如可以断点查看输入的值是否符合预期),可读性更高,不需要为了省变量强行使用复杂写法。
内容的提问来源于stack exchange,提问作者Priyantha Fernando
相关产品推荐
相关产品推荐

