C ++ cout方法编程风格好

时间:2016-01-20 07:54:53

标签: c++ oop methods

你有什么用,我应该在方法中使用cout <<吗?或者我应该返回一个数组?因为我需要多一个返回value

我有课程SGetraenkeAutomat,这里是.h文件

class SGetraenkeAutomat
{
    public:
        // this method
        void DisplayInventory();

        SGetraenkeAutomat();
        SGetraenkeAutomat(int nColaAnzahl, int nSpriteAnzahl, int nFantaAnzahl);
        virtual ~SGetraenkeAutomat();
    private:
        int m_nColaAnzahl;
        int m_nSpriteAnzhal;
        int m_nFantaAnzahl;
};

void SGetraenkeAutomat::DisplayInventory()

中的方法SGetraenkeAutomat.cpp
void SGetraenkeAutomat::DisplayInventory(){
    std::cout << m_nColaAnzahl;
    std::cout << m_nSpriteAnzahl;
    std::cout << m_nFantaAnzahl;
}

这是一种很好的编程风格吗?

- &GT;我不这么认为,但也许有人可以解释一下。

4 个答案:

答案 0 :(得分:2)

我宁愿将其重命名为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(); // prints to stdout

或类似

automat.PrintInventory(std::cerr); // prints to stderr, for example

答案 1 :(得分:1)

  

或者我应该返回一个数组吗?

没有。该课程有3个private成员,最好不要将它们暴露在外面,这导致在大多数情况下紧密耦合。

  

我应该使用cout&lt;&lt;在方法?

如果它满足要求,那应该没问题。

答案 2 :(得分:1)

在这种情况下,因为该方法被称为DisplayInventory,所以不会期望它返回任何内容,但实际上以某种方式向用户显示库存。这符合Tell, Don't Ask&#34;规则&#34;它说你应该告诉你的对象该做什么,不要问他们关于他们状态的问题。

在一个简单的应用程序中,使用cout与用户交互是完全可以接受的;另一种选择是使用GUI来显示信息。

您也可以这样看待:要将广告资源显示到标准输出,您必须在某处使用cout 。在我看来,将它封装在类方法中比用getter公开所有数据(因此打破&#34;告诉,不要问&#34;)并在类外打印它当然更好(在我看来)。

如果你想获得更多的想象力并获得可自定义的输出,你可以创建某种格式化程序类并将其传递给显示功能(谢尔盖的回答是这个原则的变体)。

答案 3 :(得分:1)

答案取决于你的任务。如果需要显示变量而不是使用某些流来显示。如果您的程序中的其他类需要来自您的SGetraenkeAutomat类的数据,那么您应该为每个私有成员提供公共getter。例如:

int get_ColaAnzahl()
{
 return  m_nColaAnzahl;
}

正如我在你的案例中所看到的,最好创建一些基类(让我们把它命名为Drink):

struct Drink {
int count;
std::string name;
}

然后将您的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;
};

我想你理解我上面描述的想法。