在类中初始化向量
Posted
技术标签:
【中文标题】在类中初始化向量【英文标题】:initialize vector in class 【发布时间】:2016-12-09 18:35:08 【问题描述】:我有以下问题。我有课,说
class MyClass
public:
class MyNumber;
MyClass(char const *filename);
class MyNumber
public:
MyNumber(int n) : n(n)
private:
int n;
;
private:
std::vector<MyNumber> mynumbers
;
现在我想为 MyClass 类编写一个构造函数,它读取一个文件并根据文件的内容初始化向量 mynumbers。我所做的是以下
MyClass::Myclass (char const * filename)
int num = 0;
std::string line;
std::getline(file, line);
std::stringstream ss(line);
ss >> num;
mynumbers(num,MyNumber(5));
但我收到错误“类型 'std::vector' 不提供呼叫运算符”。我也不能使用构造函数初始化列表(至少我是这么认为的),因为它取决于我的输入文件我的向量必须有多大。 有人可以告诉我这是怎么做到的吗?
【问题讨论】:
执行任何 I/O(除了日志记录)的构造函数通常是个坏主意。考虑将文件的读取移至单独的设置函数。 我建议不要在构造函数中读取文件。改为创建“加载”或“初始化”方法。如果读取文件失败或需要创建对象的副本(例如std::vector
)会发生什么。
mynumbers.resize(num, MyNumber(5));
?
我建议不要使用嵌套类,因为它们会增加程序的复杂性(这也会使调试和测试更加复杂)。
@Thomas Matthews。如果文件格式不符合我的预期,我会抛出错误。当我编写方法而不是构造函数时,我看不出我有什么优势。
【参考方案1】:
只要使用assign
的方法
mynumbers.assign(num,MyNumber(5));
至于这个说法
mynumbers(num,MyNumber(5));
那么它对应于函数运算符的调用。但是标准类std::vector
没有这样的运算符。构造函数中的对象mynumbers
已经创建/因此您只能为其分配新值。您不能第二次调用它的构造函数。另一方面,assign
方法被重载,以至于它对应于类的大多数构造函数。
【讨论】:
感谢这项工作。你能用一句话解释为什么这行得通,但我的问题中的那个行不通吗?以上是关于在类中初始化向量的主要内容,如果未能解决你的问题,请参考以下文章