2011-11-22 21 views
2

请帮助我在构造函数中初始化“out”?如何使用“char * filename”初始化构造函数中的“ostream&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; } 
}; 

这个类将在全球范围定义为他人只是调用打印方法

更新: 我计划有以下设置,其中类的用户可以 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*/) {} 

}

+0

你究竟想要完成什么?您是否尝试创建连接到提供的文件名的输出流?例如。记录器l =新记录器(“foo.txt”);会创建一个ostream并打开“foo.txt”进行编写? –

+0

是......“l”将在全球范围内提供...... – rakesh

回答

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" 
}; 
+0

“您不需要将流声明为引用,除非您希望稍后从其他流中设置该流。”这没有多大意义,因为引用不能改变。 – PlasmaHH

+0

@PlasmaHH更新回答。 –

+2

只是一个nit,但我会颠倒声明的顺序。无论你在构造函数中写什么,'out'都将被构造_before_'file'。直到构建'file',将其转换为'ostream&'是正式的未定义行为。 –

2

关于唯一的解决办法这将工作将是:

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

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

+0

* * new:ofstream(name)'正确的语法? – Nawaz

+0

@Nawaz号我会编辑帖子来修复它。 –

+0

我试过了......没有用... – rakesh