C++ 为什么可以';在类的构造函数的初始值设定项列表中初始化ifstream吗? #包括 #包括 使用名称空间std; 类文件读取器{ 公众: 文件读取器(常量字符*文件名):文件(ifstream(文件名)){} 字符运算符[](整数索引)常量{ 文件.seekg(索引); 返回file.get(); } 私人: ifstream文件; };
我得到一个错误:C++ 为什么可以';在类的构造函数的初始值设定项列表中初始化ifstream吗? #包括 #包括 使用名称空间std; 类文件读取器{ 公众: 文件读取器(常量字符*文件名):文件(ifstream(文件名)){} 字符运算符[](整数索引)常量{ 文件.seekg(索引); 返回file.get(); } 私人: ifstream文件; };,c++,C++,我得到一个错误:“std::ios\u base::ios\u base(const std::ios\u base&)”是私有的。代码似乎试图调用层次结构中更高的构造函数。尽管ifstream有一个构造函数,它接受const char*。问题出在哪里?通过创建一个临时的ifstream(文件名)然后从中初始化文件,您试图调用文件的副本构造函数,但这失败了,因为该构造函数在声明的位置是私有的(在基ios\u基中);无法复制流 我相信你是想写这封信的: #include <fstream&g
“std::ios\u base::ios\u base(const std::ios\u base&)”是私有的
。代码似乎试图调用层次结构中更高的构造函数。尽管ifstream
有一个构造函数,它接受const char*
。问题出在哪里?通过创建一个临时的ifstream(文件名)
然后从中初始化文件
,您试图调用文件的副本构造函数,但这失败了,因为该构造函数在声明的位置是私有的(在基ios\u基中)
;无法复制流
我相信你是想写这封信的:
#include <fstream>
#include <iostream>
using namespace std;
class file_reader {
public:
file_reader(const char* file_name) : file(ifstream(file_name)) { }
char operator[](int index) const {
file.seekg(index);
return file.get();
}
private:
ifstream file;
};
记住,这是:
file_reader(const char* file_name) : file(file_name) { }
就初始化而言,S
非常类似于:
struct T
{
S object;
type() : object(arg) {};
};
通过创建一个临时的
ifstream(文件名)
然后从中初始化文件
,您试图调用文件的复制构造函数,但这失败了,因为该构造函数在声明它的地方是私有的(在基ios\u基
中);无法复制流
我相信你是想写这封信的:
#include <fstream>
#include <iostream>
using namespace std;
class file_reader {
public:
file_reader(const char* file_name) : file(ifstream(file_name)) { }
char operator[](int index) const {
file.seekg(index);
return file.get();
}
private:
ifstream file;
};
记住,这是:
file_reader(const char* file_name) : file(file_name) { }
就初始化而言,S
非常类似于:
struct T
{
S object;
type() : object(arg) {};
};
但是
file(file\u name)
是否等同于file=file\u name
(当然不会编译),而file(ifstream(file\u name))
是否等同于file=ifstream(file\u name)
-它不应该调用复制构造函数,而应该调用赋值操作符?否,这两件事都不等同于另一件事。赋值运算符与初始化无关<成员初始化器列表中的code>file(file\u name)类似于std::ifstream file(file\u name)
。因此初始化器列表总是使用给定参数调用初始化对象的构造函数?顺便说一句,我想添加一个方法,将流更改为不同的对象(即setter)。我可以说file=somethingelse
。但这不会尝试调用复制构造函数吗?或者这样可以吗?另外,代码private:ifstream文件
是否已经调用了ifstream
的构造函数?但是file(file\u name)
是否等同于file=file\u name
(当然不会编译),而file(ifstream(file\u name))
等同于file=ifstream(file\u name)
-哪个不应该调用复制构造函数,而应该调用赋值运算符?不,这两个东西都不等同于另一个东西。赋值运算符与初始化无关<成员初始化器列表中的code>file(file\u name)类似于std::ifstream file(file\u name)
。因此初始化器列表总是使用给定参数调用初始化对象的构造函数?顺便说一句,我想添加一个方法,将流更改为不同的对象(即setter)。我可以说file=somethingelse
。但这不会尝试调用复制构造函数吗?或者这样可以吗?另外,代码private:ifstream文件
是否已经调用了ifstream
的构造函数?