【发布时间】:2015-04-29 02:26:17
【问题描述】:
所以我声明了一个指针数组,看起来像
Items* _items[ARRSIZE];
基本上是为了将它们用作一组对象(一个用于肉类,一个用于农产品),这些对象在运行时动态决定。我在构造函数中调用了以下函数,我已将其确定为我在 main 函数之前不断进行段错误的原因。
void Inventory::loadRecs(){
datafile.open(_filename);
int i = 0;
char c;
//create fileif it doesnt exist
if(datafile.fail()){
datafile.clear();
datafile.close();
datafile.open(_filename, ios::out);
datafile.close();
}
else{
//read from file
while(!datafile.eof()){
if(_items[i] != nullptr){
delete _items[i];
}
c = datafile.get();
if(c == 'P'){
_items[i] = new Produce;
}
if (c == 'M'){
_items[i] = new Meat;
}
datafile.ignore();
_items[i]->load(datafile);
i++;
datafile.ignore(); //ignore endl
}
_noOfItems = i;
datafile.close();
}
}
我正在阅读的文本文件是相当直接的阅读类似
P,123,胡萝卜,0.66,[NEWLINE] 第一个字符标识它是什么类型的产品(肉类或农产品),其余的行用 load 函数读入。
我的 Inventory 类看起来像这样:
class Inventory{
char _filename[256];
Item* _items[5];
std::fstream datafile;
int _noOfItems;
}
构造函数只是初始化所有内容并调用loadsRecs(这是我从中获取段错误的地方)
【问题讨论】:
-
Item::load()长什么样子? -
另外,最好使用 RAII,而不是显式调用
open和close。 -
对成员变量使用前导下划线也是一种不好的做法,因为您可能会与 reserved identifiers 发生冲突。
-
有什么理由不能使用标准库容器吗?看到像
char _filename[256]这样的静态大小的数组几乎总是表明您的程序由于缺少边界检查而出现严重错误。std::string没有这些问题。
标签: c++ arrays pointers initialization