【问题标题】:I can't create an object with my class我无法用我的班级创建对象
【发布时间】:2015-08-01 18:52:05
【问题描述】:

我想创建一个具有 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 中有一个并且它是被继承的。那为什么我不能使用它 因为我觉得我应该也可以……? :o

感谢您阅读

亚历克斯

【问题讨论】:

  • C++ - 应该是int main
  • 构造函数确实有参数
  • 好的。但是,当我希望 my_cout 进行控制台输出时,如何制作 filebuf 呢?而且不像“text.txt”输出
  • 不要从namespace std继承类,经验法则。

标签: c++ class inheritance ostream


【解决方案1】:

这有点恶心(甚至可能真的很恶心),但是如果您可以容忍两个输出类使用相同的输出缓冲区,那么 OP 就可以参加比赛了。如果需要,您可以窃取 cout 的缓冲区,然后将 cout 指向另一个缓冲区以防止交叉污染。这可能会给期望良好的 ol' 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;
}

【讨论】:

  • 非常感谢:D 这正是我想要的,我不知道,但 C++ 是如此复杂 xD
  • @Brogramer Bub,等到你遇到模板元编程。
  • 不知道能不能走到这一步…… ;v
【解决方案2】:

那是因为您私下继承自 ostream。试试:

class my_ostream : public ostream {};

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

编辑: 虽然上述解决方案适用于 gcc(请参阅评论),但不适用于 MSVC。但这与 ostream 一致:您也不能创建默认构造的 ostream。您必须从 streambuf 指针到 construct ostream(以及 my_ostream)。解决方法:

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

【讨论】:

  • 还是有问题:v
  • 编译、运行,但什么都不做,因为没有附加输出缓冲区。我认为这就是@EdHeal 试图在上面得到的。在 MSVC 中不起作用,可能是因为没有 ostream 默认构造函数。不知道为什么会在 GCC 中编译。
  • libstdc++ 和 libc++ 都为 basic_ostream 提供了保护的默认构造函数,尽管这不是标准所要求的。在任何情况下,您都应该在默认构造函数中使用指向流缓冲区的指针(可能是nullptr)初始化basic_ostream 基址。
  • 好的。现在我明白了。谢谢,@0x499602D2。
  • @0x499602D2 是的,我注意到并编辑了我的答案。
猜你喜欢
  • 2018-01-31
  • 1970-01-01
  • 2018-10-27
  • 2016-01-23
  • 1970-01-01
  • 2012-06-19
  • 2016-03-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多