【问题标题】:C++ output operator overloadC++ 输出运算符重载
【发布时间】:2011-05-29 14:59:36
【问题描述】:

我一直在做这项学校作业。赋值告诉我们创建一个输出操作符(

#include <ostream>
using namespace std;

template <class T>
class CustomObject {

        string print() {
            string text = "";
            for (int i = 0; i < num_items(); i++) {
                text += queue[i];
                text += " | \n";
            }
            return text;
        }

        friend std::ostream& operator <<(std::ostream &output, CustomObject &q) {
            output << "" << q.print();
            return output;
        }
}

所以我像这样实例化这个对象:

CustomObject<int> co();

并调用它的输出方法:

std::cout << co();

这将不可避免地调用打印方法,并将字符串返回到默认输出流。

但是,我的控制台/调试器中没有可见的输出。

我在这里错过了什么?

PS 这不是完整的类,它是通用的,因为这里没有必要显示其他几个方法和功能。

PPS num_items() 和queue 变量是说rest 的一部分,这个类是一个PriorityQueue 对象。因此,queue 是一个指定类型的数组(因此是泛型声明),而 num_items() 只返回数组的计数。

【问题讨论】:

    标签: c++ generics overloading


    【解决方案1】:
    CustomObject<int> co();
    

    这是一个函数声明。省略括号。

    std::cout << co();
    

    您为什么将operator() 应用到co?再次,省略括号。这应该有效:

    CustomObject<int> co;
    std::cout << co;
    

    唉,从 print 方法构建和返回字符串几乎不是惯用的 C++。这是我会做的:

    template <typename T>
    class CustomObject
    {
        // ...
    
    public:
    
        void print(std::ostream& os) const
        {
            for (int i = 0; i != num_items(); ++i)
            {
                os << queue[i] << " | \n";
            }
        }
    };
    
    std::ostream& operator<<(std::ostream& os, const CustomObject& object)
    {
        object.print(os);
        return os;
    }
    

    【讨论】:

    • 我假设他正在应用函数调用运算符,因为co 是一个函数,编译器一直抱怨,直到他添加了括号。当然,链接应该失败,因为co 没有定义,只是一个声明。并且编译应该失败,因为正如@Bo 指出的那样,operator&lt;&lt; 采用了一个非常量引用,它不能绑定一个临时的。因此,任何人都在猜测实际测试的代码。
    • 用于我的自定义类的构造方法的括号。或者这不是调用我的对象的构造方法的正确方法?
    • 很不确定从问题到工作代码,它有效。你能指出问题所在吗?我仍然在创建对象时使用括号,从调试器中可以看到它调用它的构造函数。是否有一种“有效”的方式来做这些事情,例如目标c?而且,这里使用 const 标志有什么实际用途,我知道它的作用等等,但我认为我的代码逻辑会忽略使用 'const' 的必要性...... :D 谢谢,现在就像一个魅力!
    【解决方案2】:

    如果您希望能够很好地打印临时对象,则应将参数设为 const 引用:

    CustomObject const& q)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-15
      • 2012-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多