C++ C++;具有良好的编程风格
你认为我应该使用C++ C++;具有良好的编程风格,c++,oop,methods,C++,Oop,Methods,你认为我应该使用cout吗 还是应该返回数组 不。该类有3个私有成员,最好不要将它们暴露在外部,这在大多数情况下会导致紧密耦合 我应该用cout吗 还是应该返回数组 不。该类有3个私有成员,最好不要将它们暴露在外部,这在大多数情况下会导致紧密耦合 如果使用cout我宁愿将其重命名为PrintInventory,并提供一个可选参数: void PrintInventory(std::ostream &output = std::cout); 通过这种方式,您可以将库存输出到其他流
cout吗
还是应该返回数组
不。该类有3个私有成员,最好不要将它们暴露在外部,这在大多数情况下会导致紧密耦合
我应该用cout吗
还是应该返回数组
不。该类有3个私有成员,最好不要将它们暴露在外部,这在大多数情况下会导致紧密耦合
如果使用cout我宁愿将其重命名为PrintInventory
,并提供一个可选参数:
void PrintInventory(std::ostream &output = std::cout);
通过这种方式,您可以将库存输出到其他流,同时无需每次打印到标准输出时都指定库存
void SGetraenkeAutomat::PrintInventory(std::ostream &output){
output << m_nColaAnzahl;
output << m_nSpriteAnzahl;
output << m_nFantaAnzahl;
}
或者类似的
automat.PrintInventory(std::cerr); // prints to stderr, for example
我宁愿将其重命名为PrintInventory
,并提供一个可选参数:
void PrintInventory(std::ostream &output = std::cout);
通过这种方式,您可以将库存输出到其他流,同时无需每次打印到标准输出时都指定库存
void SGetraenkeAutomat::PrintInventory(std::ostream &output){
output << m_nColaAnzahl;
output << m_nSpriteAnzahl;
output << m_nFantaAnzahl;
}
或者类似的
automat.PrintInventory(std::cerr); // prints to stderr, for example
在这种情况下,由于该方法被称为DisplayInventory
,因此人们不会期望它返回任何内容,而是实际以某种方式向用户显示库存。这与“规则”是一致的,规则规定你应该告诉你的对象该做什么,而不是问他们关于他们状态的问题
在一个简单的应用程序中,使用cout
与用户交互是完全可以接受的;另一种选择是使用GUI显示信息
您也可以这样看:要将库存显示为标准输出,您必须在某处使用cout
。在我看来,将其封装在类方法中当然比使用getter公开所有数据(从而打破“告诉,不要问”)并在类外打印要好
如果你想变得更花哨,并使输出可定制,你可以创建某种格式化程序类,并将其传递给显示函数(Sergey的答案是这个原理的一个变体)。在这种情况下,由于该方法被称为DisplayInventory
,人们不会期望它返回任何东西,但实际上是以某种方式向用户显示库存。这与“规则”是一致的,规则规定你应该告诉你的对象该做什么,而不是问他们关于他们状态的问题
在一个简单的应用程序中,使用cout
与用户交互是完全可以接受的;另一种选择是使用GUI显示信息
您也可以这样看:要将库存显示为标准输出,您必须在某处使用cout
。在我看来,将其封装在类方法中当然比使用getter公开所有数据(从而打破“告诉,不要问”)并在类外打印要好
如果您想变得更花哨,并使输出可定制,可以创建某种格式化程序类并将其传递给显示函数(Sergey的答案是这一原理的变体)。答案取决于您的任务。如果需要显示变量,请使用一些流来显示。如果程序中的其他类需要来自SGetraenkeAutomat类的数据,则应该为每个私有成员提供公共getter。例如:
int get_ColaAnzahl()
{
return m_nColaAnzahl;
}
正如我在您的案例中所看到的那样,创建一些基类(让我们命名它)会更好:
然后将SGetraenkeAutomat类修改为:
class SGetraenkeAutomat
{
public:
// this method
void DisplayInventory() {
for (auto drink: drinks) {
std::cout << drink.name << ": " << drink.count << std::endl;
}
}
void addDrink(const Drink& drink) {
drinks.push_back(drink);
};
SGetraenkeAutomat();
virtual ~SGetraenkeAutomat();
private:
std::vector<Drink> drinks;
};
类sgetraenke自动机
{
公众:
//这种方法
无效库存(){
用于(自动饮料:饮料){
std::cout答案取决于您的任务。如果您需要显示变量,请使用一些流来显示。如果您程序中的其他类需要来自SGetraenkeAutomat类的数据,则应为每个私有成员提供公共getter。例如:
int get_ColaAnzahl()
{
return m_nColaAnzahl;
}
正如我在您的案例中所看到的那样,创建一些基类(让我们命名它)会更好:
然后将SGetraenkeAutomat类修改为:
class SGetraenkeAutomat
{
public:
// this method
void DisplayInventory() {
for (auto drink: drinks) {
std::cout << drink.name << ": " << drink.count << std::endl;
}
}
void addDrink(const Drink& drink) {
drinks.push_back(drink);
};
SGetraenkeAutomat();
virtual ~SGetraenkeAutomat();
private:
std::vector<Drink> drinks;
};
类sgetraenke自动机
{
公众:
//这种方法
无效库存(){
用于(自动饮料:饮料){
std::通常最好有一个toString()之类的东西方法,该方法创建一个字符串化的对象表示,然后可以打印到您喜欢的任何流。或者也可以像下一个注释建议的那样返回结构。根据您想要做的事情,该方法被称为Display…
,因此我希望它使用cout或gui。如果它返回数组中的清单,它将被调用d获取…
。你拥有的是自我-consistent@KaiIskratsch谢谢你的评论。你能给我一个小例子吗?这种方法最简单的方法就是使用std::stringstream,并用dislpay中相同的输出给它,然后以std::string的形式返回结果。通常最好使用类似于toString()的东西方法,该方法创建一个字符串化的对象表示,然后可以打印到您喜欢的任何流。或者也可以像下一个注释建议的那样返回结构。根据您想要做的事情,该方法被称为Display…
,因此我希望它使用cout或gui。如果它返回数组中的清单,它将被调用d获取…
。你拥有的是自我-consistent@KaiIskratsch谢谢你的评论。你能给我一个小例子吗?这种方法最简单的方法就是使用std::stringstream并将其与dislpay中的输出相同,然后将结果作为std::string返回。我应该公开它们吗?因为我想播放资源清册。@MyNewName最好创建一个公共成员方法来显示资源清册,将它们全部封装在类中。那么我是否应该将它们公开?因为我想显示资源清册。@MyNewName最好创建一个公共成员方法来显示资源清册,将它们全部封装在类中。