我不能用我的班级创建一个对象

时间:2015-08-01 18:52:05

标签: c++ class inheritance ostream

我想创建一个具有ostream的所有功能的类,以及我添加的一些功能。我添加的功能 因为我甚至没有开始写它们并得到错误而遗失了:(

这是我的源代码

#include "stdafx.h"
#include "iostream"
using namespace std;

class my_ostream : ostream {};

int main() {
    my_ostream my_cout;    // my_cout is underlined
    my_cout << "Hello World!";
}

这是我得到的错误

IntelliSense: the default constructor of "my_ostream" 
cannot be referenced -- it is a deleted function

我知道这意味着什么,但默认构造函数应该是可访问的,因为ostream中有一个并且它是继承的。那么我为什么不能使用它呢? 因为我觉得我也应该...... :○

感谢您阅读&lt; 3并帮助我解决这个简单的问题

亚历

2 个答案:

答案 0 :(得分:1)

这有点蠢(可能甚至真的很icky)但是如果你可以容忍使用相同的输出缓冲区有两个输出类,那么OP就不会参加比赛了。如果你愿意,你可以窃取cout的缓冲区然后将cout指向另一个缓冲区以防止交叉污染。这可能会给那些期待好的人带来令人讨厌的惊喜。 cout工作,所以缓冲共享可能更糟。

#include <iostream>

class my_ostream: public std::ostream
{
public:
    my_ostream():std::ostream(std::cout.rdbuf())
    {

    }

    //extra functionality goes here
};

int main(int argc, char * argv[])
{
    my_ostream my_cout;    // my_cout is underlined
    my_cout << "My Hello World!" <<std::endl;
    std::cout << "cout Hello World!" <<std::endl;
}

答案 1 :(得分:-1)

那是因为你私下继承了ostream。试试:

class my_ostream : public ostream {};

评论:或许我应该指出,由于多种原因继承标准对象总是有点冒险。您是否考虑使用构图而不是继承?

编辑:虽然上面的解决方案适用于gcc(请参阅注释),但它不适用于MSVC。但这与ostream一致:您也无法创建默认构造的ostream。您必须从ostream指针construct my_ostream(以及streambufnetcat for Windows。解决方法:

    class my_ostream : public ostream 
    {
    public:
        my_ostream() : ostream(nullptr) {}  // workaround
    };