我发现至少有3种使用cpp类的方法。我的问题是,使用哪种方法是更好的方法,如main()函数所示。
我们假设setExpTime()是一个复杂的操作并更改了一些复杂的类属性,并且我不希望上一批产品的setExpTime()操作影响最近一批产品。
我还有没有更好的方法?
谢谢。
#include <iostream>
using namespace std;
class Scanner
{
public:
Scanner();
Scanner(int expTimeIn);
~Scanner();
void setExpTime(int expTimeIn);
void scanOneProduct();
private:
int expTime;
};
Scanner::Scanner()
{
}
Scanner::Scanner(int expTimeIn)
{
//expTime = expTimeIn;
setExpTime(expTimeIn);
}
void Scanner::setExpTime(int expTimeIn)
{
expTime = expTimeIn;
}
void Scanner::scanOneProduct()
{
cout << "scan one product with expTime " << expTime << endl;
}
Scanner::~Scanner()
{
}
int main()
{
//////////////////////////////////////////
cout << "usage of the class: method 1" << endl;
{
Scanner scanner01;
scanner01 = Scanner();
// batch 1
scanner01.setExpTime(200);
scanner01.scanOneProduct();
scanner01.scanOneProduct();
scanner01.scanOneProduct();
// batch 2
scanner01.setExpTime(400);
scanner01.scanOneProduct();
scanner01.scanOneProduct();
scanner01.scanOneProduct();
// batch 3
scanner01.setExpTime(600);
scanner01.scanOneProduct();
scanner01.scanOneProduct();
scanner01.scanOneProduct();
}
//////////////////////////////////////////
cout << "usage of the class: method 2" << endl;
{
Scanner scanner01;
// batch 1
scanner01 = Scanner(200);
scanner01.scanOneProduct();
scanner01.scanOneProduct();
scanner01.scanOneProduct();
// batch 2
scanner01 = Scanner(400);
scanner01.scanOneProduct();
scanner01.scanOneProduct();
scanner01.scanOneProduct();
// batch 3
scanner01 = Scanner(600);
scanner01.scanOneProduct();
scanner01.scanOneProduct();
scanner01.scanOneProduct();
}
//////////////////////////////////////////
cout << "usage of the class: method 3" << endl;
{
Scanner scanner01;
// batch 1
scanner01 = Scanner();
scanner01.setExpTime(200);
scanner01.scanOneProduct();
scanner01.scanOneProduct();
scanner01.scanOneProduct();
// batch 2
scanner01 = Scanner();
scanner01.setExpTime(400);
scanner01.scanOneProduct();
scanner01.scanOneProduct();
scanner01.scanOneProduct();
// batch 3
scanner01 = Scanner();
scanner01.setExpTime(600);
scanner01.scanOneProduct();
scanner01.scanOneProduct();
scanner01.scanOneProduct();
}
return 0;
}
答案 0 :(得分:0)
我宁愿重新设计类本身以允许类重用。如果使用模式如此,它不应该是访客吗?或者至少它可以具有方法init()
无论如何,不要害羞地写:
Scanner scanner(200); // you created and initialized it.
相当于
Scanner scanner = Scanner(200);
在某些方面要比
好 Scanner scanner; // you created and default-initialized it.
scanner = Scanner(200); // you created another, initialized it
// and assigned to existing object
请注意,在本地块中,默认初始化等于object的不确定状态,因此要使用零值初始化它,您必须编写:
Scanner scanner{}; // if there is no default constructor.
由于您声明了默认构造函数,而不是=default
(即由编译器生成的构造函数),因此您必须在那里初始化对象的状态。
Scanner::Scanner() : expTime() {}
您当前的默认构造函数使对象的内容不确定。正式将其分配给另一个对象是UB(未定义行为)。
考虑您可以像这样编写自定义构造函数,这是最理想的方法:
Scanner(int expTimeIn): expTime(expTimeIn) {}
类似Java的getter / setter并不是封装的工具,而是后门。尽管在某些情况下它们是必不可少的邪恶,但是以宣传如何编写Java代码的方式编写C ++代码是非常有害的。