如何使用“char * filename”在构造函数中初始化“ostream& out”

时间:2011-11-22 11:25:52

标签: c++

请帮我在构造函数中初始化“out”?

class logger {
        ostream &out;

        public:
        logger(char *str) : out(/*How do i construct an object using str*/) {}    

        template <typename T> void print(T &obj) { out << obj; }
};

这个类将被全局定义为其他人只调用print方法

更新:     我打算在下面设置,类的用户可以 1)创建一个新的ostream对象,如果他没有。他可以创造,但他也必须管理它。所以不想给这个功能。 2)如果他已经有一个他可以传递像“cout / cerr”。 3)如果他没有通过任何“cerr”将被假定。

{

    ostream &out;

    public:
    logger() : out(cerr) {}         
    logger(ostream &o) : out(o){}
    logger(char *str) : out(/*How do i construct an object using str*/) {}

}

2 个答案:

答案 0 :(得分:4)

除非您希望能够从另一个流初始化,否则无需将流声明为引用。这样的事情可能是:

class logger
{
    ofstream file;
    ostream &out;

public:
    logger(char *str) : file(str), out(file) {}
    logger(ostream &os) : out(os) {}

    // Other functions here, only using "out"
};

答案 1 :(得分:2)

关于唯一可行的解​​决方案是:

logger::logger( char const* name ) : out( *new std::ofstream( name ) ) {}

但你不想这样做;你还必须删除它 析构函数。如果您在课程中引用了std::ostream, 您希望客户端代码向您传递对现有ostream的引用 构造函数中的对象 - 它们保证的对象 只要您的对象存在,它就会继续存在。如果你想传入 一个文件名,并在构造函数中打开它,然后您的对象应该 包含std::ofstream,而不是参考。