【问题标题】:Declaring array in different scope in c++在 C++ 中声明不同范围的数组
【发布时间】:2015-02-27 16:39:30
【问题描述】:

我正在尝试声明文件中指定长度的对象数组。然后我想用来自同一个文件的数据填充这个数组数组。 假设我的文件如下所示:
3 - 数组长度
1 2
3 4
5 6
这是我的代码

while ( getline (myfile,line) ){
istringstream ss(line);
if(i==0){
   ss >> numOfObjects;
   Object * array[numOfObjects];
} 
if((i>=i) && (i<=1+numOfObjects)){
   Object * o=new Object();
   ss >> x >> y;
   location l;
   l.x=x;
   l.y=y;
   o->setLocation(l);
   array[i-2]=o;
}
i++; 
}

当我尝试运行我的代码时,它说数组未在此范围内声明。有什么我可以做的吗?我知道如果我在 while 循环之外声明数组,它会起作用,但我需要它必须具有文件中指定的精确长度。 对不起,如果这是一个愚蠢的问题,我只是一个初学者

【问题讨论】:

  • 可变长度数组是一个编译器扩展。您应该使用矢量。
  • @Borgleader 这个,它没有在范围内声明。更多 new [] 需要。
  • @Borgleader 或通过new创建数组
  • @NO_NAME 这是可能的,绝不是推荐:) ...
  • @NO_NAME 仅仅因为你可以并不意味着你应该。我在告诉他他应该怎么做;)

标签: c++ arrays file


【解决方案1】:

您可以在外部声明它并使用 new after 动态分配内存。

Object * array = nullptr;
if (...)
{
 ....
 array = new Object[numOfObjects];
 ....
}

delete [] array;

正如所指出的,你应该考虑使用一个向量,它会自动管理他们的内存

【讨论】:

  • 示例中可以删除未初始化的指针。使用nullptr 对其进行初始化,并将if (array == nullptr) 放在delete[] 之前。
  • @NO_NAME 感谢指出,但在deletestackoverflow.com/questions/27133056/…之前无需检查
【解决方案2】:

读取循环外的事物数量,而不是作为其中的特例。

if (getline(myfile,line))
{
   istringstream number(line);
   number >> numOfObjects;
   Object * array[numOfObjects];

   while (i < numOfObjects && getline (myfile,line))
   {
      // ...
   }
}

【讨论】:

    猜你喜欢
    • 2014-07-26
    • 1970-01-01
    • 2014-12-24
    • 1970-01-01
    • 2016-05-05
    • 2015-09-29
    • 2012-02-12
    • 2015-04-12
    • 2010-12-17
    相关资源
    最近更新 更多