哪种方法更适合使用c ++类?

时间:2019-05-25 13:01:31

标签: c++ class

我发现至少有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;
}


1 个答案:

答案 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 ++代码是非常有害的。