【问题标题】:C++ cout in method good programming styleC++ cout 方法良好的编程风格
【发布时间】:2016-04-25 23:12:30
【问题描述】:

你有什么问题,我应该在方法中使用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;
};

SGetraenkeAutomat.cpp中的方法void SGetraenkeAutomat::DisplayInventory()

void SGetraenkeAutomat::DisplayInventory(){
    std::cout << m_nColaAnzahl;
    std::cout << m_nSpriteAnzahl;
    std::cout << m_nFantaAnzahl;
}

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

-> 我不这么认为,但也许你们中的某个人可以解释一下。

【问题讨论】:

  • 通常最好有类似 toString() 方法的东西,它创建一个字符串化对象表示,然后可以打印到您喜欢的任何流中。或者也像下一个评论者建议的那样返回结构。取决于你想做什么
  • 该方法称为Display...,所以我希望它使用cout 或gui。如果它以数组的形式返回库存,它将被称为Get...。你所拥有的是自洽的
  • @KaiIskratsch 感谢您的评论。可以举个小例子吗?
  • 这种方法最简单的方法就是使用 std::stringstream 并使用与 dislpay 中相同的输出来提供它,然后将结果作为 std::string 返回。

标签: c++ oop methods


【解决方案1】:

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

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

我应该在方法中使用 cout

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

【讨论】:

  • 那我应该把它们公开吗?因为我想展示库存。
  • @MyNewName 最好创建一个公共成员方法来显示库存,将它们全部封装在类中。
【解决方案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

【讨论】:

  • 感谢您的回答!我将此函数原型添加到我的*.h 文件中。我现在如何显示库存?
  • @MyNewName,你是什么意思?就像你以前做的一样。只是现在,如果您愿意,您可以选择传入另一个参数。
【解决方案3】:

在这种情况下,因为该方法被称为DisplayInventory,所以人们不会期望它返回任何东西,但实际上以某种方式向用户显示库存。这符合Tell, Don't Ask“规则”,即您应该告诉您的对象该做什么,而不是向他们询问有关其状态的问题。

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

您也可以这样看待:要将库存显示到标准输出,您必须使用coutsomewhere。 (在我看来)将它封装在一个类方法中肯定比用一个 getter 暴露所有数据(从而打破“告诉,不要问”)并在类之外打印它更好。

如果您想要更花哨并获得可定制的输出,您可以创建某种格式化程序类并将其传递给显示函数(Sergey 的回答是该原理的变体)。

【讨论】:

    【解决方案4】:

    答案取决于您的任务。如果您需要显示变量而不是使用一些流来显示。如果您的程序中的其他类需要来自您的 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;
    };
    

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

    【讨论】:

    • 感谢您的回答!我喜欢这个主意。结构Drink,它自己的类(Drink.h 和 Drink.cpp)?当我想灌满一种特定的饮料时,我必须遍历整个向量?
    • @MyNewName 向量是例如,当然你可以使用 std::map<:string int> 或 std::unordered_map<:string int> 其中键是名称和价值是计数。或其他收藏,取决于您的任务。在地图的情况下,您不需要创建结构饮料,直到您的饮料参数不会增长(此时您只有一个饮料参数:计数),那么地图的值将是您包含所有饮料参数的结构。它看起来像这样 std::map<:string drink>.
    猜你喜欢
    • 2010-10-18
    • 2011-02-11
    • 1970-01-01
    • 2010-09-12
    • 2016-07-17
    • 2022-10-04
    • 1970-01-01
    • 2013-09-11
    • 2011-01-27
    相关资源
    最近更新 更多