Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何初始化";奥斯特雷姆公司;“出去”;在构造函数中,使用;char*filename";_C++ - Fatal编程技术网

C++ 如何初始化";奥斯特雷姆公司;“出去”;在构造函数中,使用;char*filename";

C++ 如何初始化";奥斯特雷姆公司;“出去”;在构造函数中,使用;char*filename";,c++,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; } }; }除非您

请帮助我初始化构造函数中的“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; }
};

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

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

唯一可行的解决方案是:

logger::logger( char const* name ) : out( *new std::ofstream( name ) ) {}
但你不想这样做;您还必须在中删除它 析构函数。如果类中有对
std::ostream
的引用, 您希望客户端代码向您传递对现有
ostream
构造函数中的对象它们保证将 只要对象存在,就可以继续存在。如果你想通过 一个文件名,并在构造函数中打开它,那么您的对象应该
包含一个
std::of Stream
,而不是一个引用。

您到底想实现什么?您是否正在尝试创建连接到提供的文件名的输出流?例如,记录器l=新记录器(“foo.txt”);会创建一个ostream并打开“foo.txt”进行编写吗?是的。。。“l”将在全局范围内可用…“您不需要将流声明为引用,除非您以后想从另一个流中设置它。”这没有多大意义,因为引用无法更改。只需一个nit,但我会颠倒声明的顺序。无论您在构造函数中编写什么,
out
将在
文件
之前构造。在构建
文件之前,将其转换为
ostream&
是正式的未定义行为。@JoachimPileborg Yes。(总体策略很好,我用过一两次。)
logger::logger( char const* name ) : out( *new std::ofstream( name ) ) {}