2016-04-12 18 views
2

我想打一个类似的行为有std::cout如何在C++中正确地重载“<<”运算符?

int a = 10, b = 15, c = 7; 
MyBaseClass << "a = " << a << ", b = " << b << std::endl; 

我尝试实施一些事情我刚读,但它不为我工作。我想在一个类中实现operator,我称之为MyBaseClass。我尝试这样做:

class MyBaseClass { 
    private: 
     std::ostream someOut; 
    public: 
     // My first try: 
     std::ostream &operator<< (std::ostream &out, const std::string &message) { 
     } 

     // The second try: 
     std::ostream &operator<< (const std::string &message) { 
      someOut << message << std::endl; 
      return someOut; 
     } 

     void writeMyOut() { 
      std::cout << someOut.str() 
     }; 
}; 

当我编译此,我得到:“叫‘MyBaseClass’的含蓄到删除的默认构造函数” - 什么我需要做修复它?

OS X,Xcode,clang编译器,都是最新的。

+0

可能重复[C++初学者 - “朋友”的功能和<<运算符重载:什么是正确的方式来重载一个运算符的类?](http://stackoverflow.com/questions/2828280/c-beginner-friend-functions-and-operator-overloading-what-is-the-prope) – Joel

+0

我觉得你的第二个尝试应该工作,或多或少。编译错误可能是因为'MyBaseClass'没有构造函数,但你需要初始化'someOut'成员。 (我并不是100%确定这是问题所在,但是如果你为'MyBaseClass'提供了一个构造函数,我想你会进一步得到一些东西。具体来说,我认为你会花费足够的时间来尝试写入未初始化的'std :: ostream'叫做'someOut'。) –

+0

@DaveM。 - 如果我添加一个空的构造函数,我得到:'类型'std :: ostream'的字段(又名'basic_ostream ')保护了默认的构造函数' – JavaRunner

回答

3

您正尝试将多种值类型输出到MyBaseClass对象中,因此需要支持相同的设置。我还将someOut更改为std::ostringstream,它可以累积输出。你可能同样有希望它是一个std::ostream&传递给构造函数调用者提供的流....

class MyBaseClass { 
    private: 
     std::ostringstream someOut; 
    public: 
     ...other functions... 
     // The second try: 
     template <typename T> 
     MyBaseClass& operator<< (const T& x) { 
      someOut << x; 
      return *this; 
     } 

     void writeMyOut() const { 
      std::cout << someOut.str() 
     }; 
}; 
+0

在这种情况下,我得到:'调用隐式删除'MyBaseClass''的默认构造函数 – JavaRunner

+0

@JavaRunner:你提供了任何' MyBaseClass'构造函数你自己(也许在DaveM的提示)?如果是这样,请删除它们。使用'std :: ostream&someOut;'你需要'MyBaseClass(s​​td :: ostream&os):someOut(os){}',但是你不需要为'std :: ostringstream'指定任何构造函数。 –

+0

谢谢,你的解决方案就像一个魅力!是我的错。 – JavaRunner