在类中初始化向量

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 方法被重载,以至于它对应于类的大多数构造函数。

【讨论】:

感谢这项工作。你能用一句话解释为什么这行得通,但我的问题中的那个行不通吗?

以上是关于在类中初始化向量的主要内容,如果未能解决你的问题,请参考以下文章

“只能在类中初始化静态常量整数变量”

在类中初始化 QHash

关于“只有静态常量整型数据成员才可以在类中初始化”

在类中初始化 const

编译类型向量类的私有成员时出错 - C++ [重复]

C ++在类中初始化一个空列表