Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么在类的私有部分声明变量被认为是不好的做法?C++; 这学期我在大学里学习高级C++,我一直在努力需要重新提交我的作业,因为我使用了一个不使用变量方法来声明变量的错误实践。_C++_Class - Fatal编程技术网

为什么在类的私有部分声明变量被认为是不好的做法?C++; 这学期我在大学里学习高级C++,我一直在努力需要重新提交我的作业,因为我使用了一个不使用变量方法来声明变量的错误实践。

为什么在类的私有部分声明变量被认为是不好的做法?C++; 这学期我在大学里学习高级C++,我一直在努力需要重新提交我的作业,因为我使用了一个不使用变量方法来声明变量的错误实践。,c++,class,C++,Class,我被告知使用这样的代码是不好的做法 class test{ private: int number = 5; int number2 = 10; public: int addNums(){ number3 = number+number2; return number3;} }; 我的指导老师建议我使用这样的声明 class test{ private: int number, number2; public: void setNum

我被告知使用这样的代码是不好的做法

class test{
private:
   int number = 5;
   int number2 = 10;
public:
   int addNums(){
       number3 = number+number2;
       return number3;}
};
我的指导老师建议我使用这样的声明

class test{
private:
   int number, number2;
public:
   void setNums(userInput, userInput2){//Where user input is gained from a seperate function setting as 5, 10.
       number = userInput;
       number2 = userInput2;}
   int addNums(){
       number3 = number+number2;
       return number3;}
};

为什么在程序不需要用户输入的情况下使用预定义变量是不好的做法?我的意思是,如果用户需要为项目输入一个数字,我可以理解这样做,然后我就会这样做,但如果它不要求用户输入,我就不会有用户输入

如果没有提供用户输入,该类有意义吗

如果是,预定义的值也可能有意义。尽管目前看来,它们只是被选中的神奇数字,因为

否则,类对象就不应该是可创建的。确保构造的唯一方法是通过需要值的ctor


如果您愿意,您也可以向ctor添加默认值,尽管这是两种方法的混合,事实上与声明中提供的默认值类似。

您的讲师告诉您,只需进行最小的投资,就可以使您的类更具可用性

我的意思是,如果用户需要为项目输入一个数字,我可以理解这样做,然后我就会这样做,但如果它不要求用户输入,我就不会有用户输入

在这里,你承认它会产生预期的效果

设计时要问自己的问题是“我的用户会期望什么?”该类合理的用户会期望没有办法传递数字吗?我认为你的导师对此的回答是“不”。我也在向那个方向倾斜


请注意,程序中的硬编码输入符合相同的逻辑。你的程序的合理用户会期望没有办法传递数字吗?是的,这正是用户所要求的。

我认为setter通常是糟糕设计的标志,因为它们允许在类外对对象状态进行决策。在您(太)简单的示例中,我将初始化构造函数中的变量:

class test{
private:
   int number;
   int number2;
public:
   test(int x, int y):
      number(x), number2(y) {}

   test(): test(5, 10) {}

   int addNums(){
       return number+number2;
   }
};

然而,没有人知道测试类应该做什么,或者它有什么责任。最好将
addNums
更改为采用两个参数,并完全删除成员。

您必须问自己的基本设计问题是“这个类的目的是什么”

如前所述,它有一个名为
addNums()
的成员函数,始终返回值15(假设
number3
已在某处声明。如果这是它的目的,那么机制太多了;成员函数应该只返回15,如果这就是它的全部功能,那么它的名称应该更改,因为它不添加任何数字


另一方面,如果类的目的是保存两个值并返回它们的和,则必须有某种方法来设置值,可以通过构造函数,也可以通过某种成员函数做了一些有用的事情,正如它的名字所暗示的那样。

你的代码甚至可以编译吗?在类中初始化类成员是一个编译错误。你必须按照讲师的建议使用构造函数来初始化。除了发布的代码不能编译之外(也不能),只要您对INT_MIN和INT_MAX之间的任何整数都不感兴趣(除了
5
10
之外),第一种代码方法就没有错。如果您感兴趣,显然前者有缺点。@Vishal第二种方法肯定不会编译,但第一种方法只缺少
number3
到dec的类型lare..为什么不
struct test{static constexpr int addNums(){return 15;}
对于那些说代码不可编译的人,我把它写成了Psuedo代码,作为一个例子。因此,我从中得到的是,即使用户输入不是必需的,一般认为它是正确的?比如,即使不是必需的,我也应该添加它?如果是这样,那么,我可以得到这个np。感谢额外的见解:)从你们班的角度来看,是的,这是一个很好的看待它的方式。听起来很有趣的概念,但我不太确定我是否遵循了你们的例子。这些东西我们还没有涉及到,我相信一个简单的谷歌会帮我找到它是什么,但目前我不明白。然而,我明白,在我发布的课程中,没有真正的结果除了给你15分外,如果我贴了一些特别有用的东西,你会更容易得到一个可靠的答案。你可以完全删除
number3
,这在任何情况下都是一个错误。