从文件实例化:构造函数采用std:ifstream&作为参数
Instantiating from file : constructor taking std:ifstream& as argument
我希望有一个类构造函数来从文件中读取值,所以我定义了一个这样的类:
#include<iostream>
#include<fstream>
#include<string>
class aClass
{
float value;
public:
aClass(float v) : value(v) {}
aClass(const aClass& other): value(other.value) {}
static aClass initFromFile(std::ifstream &);
};
aClass initFromFile(std::ifstream &is)
{
std::string strBuffer;
std::getline(is, strBuffer);
float v = std::stof(strBuffer);
return aClass(v);
}
我的问题是关于static initFromFile
构造函数的。
然后主程序将打开一个文件,读取一个值并实例化该类:
int main()
{
std::ifstream inFile("value.txt");
aClass cls(aClass::initFromFile(inFile));
}
代码已编译,但链接时出错:
undefined reference to `aClass::initFromFile(std::basic_ifstream<char, std::char_traits<char> >&)'
为什么inFile
不std::ifstream
?
正如评论中所说:
aClass initFromFile(std::ifstream &is) {}
是自由(非成员(函数的定义。你想要
aClass aClass::initFromFile(std::ifstream &is)
相反。
此外,您的复制构造函数是无用的,可以删除。隐式生成的将做同样的事情。
您误解了错误。它与inFile
是否是std::ifstream
无关(它是(。问题在于initFromFile
函数的实现。
aClass initFromFile(std::ifstream &is)
{
...
}
声明一个与aClass
无关的新功能。为了让编译器知道initFromFile
确实是aClass::initFromFile
,你必须告诉它:
aClass aClass::initFromFile(std::ifstream &is)
// ^^^^^^^^
{
...
}
但是,initFromFile
不使用类内部结构,因此一般的经验法则是它不应该是类的成员。
class aClass
{
float value;
public:
aClass(float v) : value(v) {}
aClass(const aClass& other): value(other.value) {}
};
aClass initFromFile(std::ifstream &is) //stand-alone free function
{
std::string strBuffer;
std::getline(is, strBuffer);
float v = std::stof(strBuffer);
return aClass(v);
}
它可以用作
int main()
{
std::ifstream inFile("value.txt");
aClass cls = initFromFile(inFile);
}
不相关的注释:
一个小的改进是使用std::istream
定义initFromFile
aClass initFromFile(std::istream &is)
以便您可以将该功能用于更广泛的流,例如 cin
.
还要熟悉三、五和零规则。 aClass
符合零规则,因此不需要用户定义的复制构造函数。
相关文章:
- std::ifstream::read 不会读取所有 512 字节,并设置 EOF 和失败位
- 如何将 std::ifstream 转换为 std::basic_istream<CharT, Traits>&?
- std::ifstream 在读取文件中最后一项时设置 eofbit,但仅在读取数值类型时发生
- 如何将QByteArray转换为std::istream或std::ifstream?
- C++:std::ofstream 方法 open() 在第二次迭代时擦除打开的 ifstream 文件
- 从带有 std::ifstream::read() 的文件中读取 int 遍历 char * 二进制数据
- std::ifstream因某种原因关闭了?
- std::ifstream.read() 不会向我的缓冲区返回任何内容
- 自定义类对象的C++向量 - 复制构造函数已删除 - std::ifstream
- std::ifstream 数据类型?
- 将 istream 转换为 ifstream 时将 std::cin 传递到参数时出现问题
- std::ifstream,使用已删除功能
- std::ifstream 在二进制模式下,语言环境在 C++ 中
- std :: ifstream的开头角色是什么
- 如何从文件*中获取和std :: ifstream对象
- 严重性代码说明项目文件行抑制状态错误 C2676 二进制">>":"std::ifstream"
- 如何使用行位置在std :: ifstream中导航
- 如何重用包含 std::ifstream 的类
- 使用std::ifstream, std::istream_iterator和std::copy不会读取整个文件
- 在什么实际情况下bool(std::ifstream) != std::ifstream::good()