【问题标题】: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。如果文件格式不符合我的预期,我会抛出错误。当我编写方法而不是构造函数时,我看不出我有什么优势。

标签: c++ class oop vector


【解决方案1】:

只要使用assign的方法

mynumbers.assign(num,MyNumber(5));

至于这个说法

mynumbers(num,MyNumber(5));

那么它对应于函数运算符的调用。但是标准类std::vector 没有这样的运算符。构造函数中的对象mynumbers 已经创建/因此您只能为其分配新值。您不能第二次调用它的构造函数。另一方面,assign 方法被重载,以至于它对应于类的大多数构造函数。

【讨论】:

  • 感谢这项工作。你能用一句话解释为什么这行得通,但我的问题中的那个行不通吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-20
  • 2017-03-25
  • 2016-08-19
  • 1970-01-01
  • 2011-05-18
  • 1970-01-01
相关资源
最近更新 更多