如何处理构造函数的过多参数
How to deal with too many arguments to a constructor?
我是一名编程初学者,我正在学习C++编程语言,这本书是:使用C++编程原理和实践。今天我来这里是因为我需要帮助解决一个技术问题。在第9章中,我必须编写一个程序来实现Book类,就像我们可以想象的那样,它是库软件的一部分。我们的图书类将有4个成员:ISBN(以n-n-n-x形式表示,其中n是整数,x是字母或数字(、作者姓名、书名和版权日期。
我刚开始使用类,所以我还在学习程序员在编写代码时应该考虑什么,对于这个类,我认为我们不能提供任何默认的构造函数,因为没有默认值可以给一本书。因此,决定为Book构造函数提供4个参数,我们会得到这样的结果:
class Book {
public:
Book(string, string, string, Date);
private:
string isbn;
string author;
string title;
Date copyright_date; // I defined the Date class in a previous exercise
};
在写了Book类的这个简短的skecth之后,我认为现在Book类的构造函数可能会成为一个问题,这是因为它需要4个参数,这些参数可以使初始化列表非常长:
Book b1{ "1,2,3,h", "Stroustrup", "Programming principles and practice using C++", {2015,Month::jan, 1} };
你认为书籍的初始化太长了吗?如果我想创建一个图书矢量呢?你将如何解决这个问题?请记住,我不是专家,所以我仍然不能理解关于课程及其设计的一切,这只是一个试图提高我的技能和更好地了解课程的问题。
既然你是一名学习者,我将给你一些你没有特别问过的建议。
首先。切勿执行using namespace std;
。命名空间std之所以被放在适当的位置是有原因的,这并不是为了让你在每个文件的开头都键入那些神奇的单词。这是为了避免名称冲突。有了这个习惯,你很快就会遇到一个非常令人困惑的编译错误,当std命名空间中有一个名称,而你自己的命名空间或其他命名空间中也有use
d时。长话短说,不要这样做:(。
第二。在函数原型中给出参数名称。Book(string, string, string, Date);
应该是Book(std::string isbn, std::string author...;
。这将帮助您(或其他代码维护人员(了解函数的期望值,而无需查找其实现。
第三。字符串参数。通过价值传递还是通过参考传递?关于这件事有很多话要说,就在上周,我真的因为说了一些我确实相信的话而受到嘲笑。我建议你稍后深入研究这件事,它很重要,并定义了你的编程习惯。现在,你只需要理解当你像你一样按值传递字符串时,会发生什么
第四。不,它不长:((你的论点列表(。为了提高可读性,可以将其拆分为几行。分裂的方式纯粹是主观的,我个人更喜欢这种形式:
Book b1{ "1,2,3,h", "Stroustrup",
"Programming principles and practice using C++",
{2015,Month::jan, 1}
};
实际上,您将多重责任放在了您的类中,这体现了单一责任原则。听起来不熟悉,对吧?
应该是。作为一个初学者,你正在学习OOP的一些基础知识,这很好。您还关心代码的可维护性。我建议首先学习OOP的所有特性,并学会在代码中实现它们。当你认为自己适合去的时候,学习以下主题:
- 代码重构
- 代码气味
- 关注点分离
- SOLID原理
慢慢来,不要着急。当你认为你有扎实的知识,可以为上述主题编写代码时,就开始学习设计模式。
这些话题不是一个镜头就能抓住的。它需要许多实践、失败、试错的方法。
- C++:使用运算符 = 调用多参数构造函数
- 通过零参数构造函数创建的 glm::mat4 应该包含哪些值?
- 好奇的混合与可变参数构造函数
- 具有默认值的单个参数构造函数是否与默认构造函数相同?
- 为什么我们需要创建一个单参数构造函数来使用临时的无名称对象
- 在可变参数构造函数中初始化常量数组
- C++ 显式多参数构造函数歧义
- 零一参数构造函数
- 可变参数构造函数中的 SFINAE
- 当没有显式关键字与单参数构造函数一起使用时,编译器可以发出警告
- 可变参数类模板和可变参数构造函数
- 确保模板参数类型与其可变参数构造函数的类型匹配
- C++默认参数构造函数与内联初始化优先级
- 如何在 c++ 中将包含复制构造函数的类的参数构造函数称为私有?
- 自动存储中没有无参数构造函数的类对象和异常
- 警告:用两个参数构造函数返回对象时,表达结果未使用
- 如何在C++中调用无参数构造函数
- 在 c++ 中具有多个参数构造函数的模板类存在问题
- 可变参数构造函数优先于用户提供的移动构造函数,除非默认
- 如何从可变参数构造函数参数构造任何对象?