C++ 在C++;
我有一个类,其中的项指向Airport对象。动态数组的大小从10开始。当C++ 在C++;,c++,arrays,pointers,dynamic,C++,Arrays,Pointers,Dynamic,我有一个类,其中的项指向Airport对象。动态数组的大小从10开始。当total大于数组的大小并且我已读入数据以填充数组时,我需要将数组的大小加倍,将旧数组中的元素复制到新大小的数组中,然后删除旧数组。数组将继续读入数据,然后调整大小,并继续执行此操作,直到文件中的所有数据都读入项数组 没有发生错误,但问题是当我运行程序时,它崩溃了。我认为我的doubleSize函数调整数组大小可能是造成这种情况的原因。有没有办法解决这个问题 class AirportList { private: A
total
大于数组的大小并且我已读入数据以填充数组时,我需要将数组的大小加倍,将旧数组中的元素复制到新大小的数组中,然后删除旧数组。数组将继续读入数据,然后调整大小,并继续执行此操作,直到文件中的所有数据都读入项
数组
没有发生错误,但问题是当我运行程序时,它崩溃了。我认为我的doubleSize
函数调整数组大小可能是造成这种情况的原因。有没有办法解决这个问题
class AirportList
{
private:
Airport* items;
int total;
int maxElements;
int oldAmount;
public:
AirportList()
{
oldAmount = 10;
maxElements = 10;
items = new Aiport[maxElements];
// a file was opened to read in data before this,
// total equals the total amount of lines in the file
string cppstr;
for (int counter = 0; counter < total; counter++)
{
getline(infile, cppstr);
items[counter] = Airport(cppstr); // the Airport constructor
// parses each line to read in
// the data and sets each Airport
// object into the items array
if (total > maxElements && counter == maxElements)
doubleSize(items, maxElements, oldAmount);
}
infile.close();
}
void doubleSize(Airport*& orig, int maxElements, int oldAmount)
{
maxElements = maxElements * 2;
Aiport* resized = new Aiport[maxElements];
for (int i = 0; i < oldAmount; i++)
resized[i] = orig[i];
delete [] orig;
orig = resized;
oldAmount = maxElements;
}
};
class机场列表
{
私人:
机场*项目;
整数合计;
整数最大元素;
国际贸易额;
公众:
机场名单()
{
oldAmount=10;
最大元素=10;
items=新的Aiport[maxElements];
//在此之前打开了一个文件以读取数据,
//total等于文件中的行总数
字符串cppstr;
用于(整数计数器=0;计数器<总计;计数器++)
{
getline(infle,cppstr);
items[counter]=机场(cppstr);//机场建造商
//解析要读入的每一行
//每个机场的数据和设置
//对象,将其放入items数组中
如果(总计>最大元素和计数器==最大元素)
双倍大小(项目、最大元素、旧金额);
}
infle.close();
}
无效加倍大小(机场*&orig、整数最大元素、整数旧金额)
{
maxElements=maxElements*2;
Aiport*已调整大小=新Aiport[maxElements];
对于(int i=0;i
只有在对数组进行赋值之后,才会将大小加倍,其中计数器==maxelements
,但是项[maxelements]
无效——只有maxelements-1
如果你把任务的规模扩大一倍,事情应该会更好
此外,没有理由检查是否
total>maxElements
。这根本没有必要。在对数组进行赋值之前,不会将大小加倍,其中计数器==maxelements
,但是项[maxelements]
无效——只有maxelements-1
如果你把任务的规模扩大一倍,事情应该会更好
此外,没有理由检查是否
total>maxElements
。这根本没有必要。我怀疑您在Airport类的复制构造函数中有错误。您需要为Airport定义一个复制构造函数(它对其数据进行深度复制),并重载assignment操作符以使用新的复制构造函数。否则,当您执行resized[i]=orig[i]代码>,您将执行一个浅复制,最终仍然指向原始(现在已删除)Airport对象中的数据
请看这里:我怀疑您对Airport类的复制构造函数有错误。您需要为Airport定义一个复制构造函数(它对其数据进行深度复制),并重载assignment操作符以使用新的复制构造函数。否则,当您执行resized[i]=orig[i]代码>,您将执行一个浅复制,最终仍然指向原始(现在已删除)Airport对象中的数据
看看这里:`我认为我的doubleSize函数调整数组大小可能是造成这种情况的原因`我们会调试它并确认是这样的!第一个明显的问题是:oldAmount
参数到doubleSize
应该是一个引用吗?如果没有,则将其设置在最后一行不会起任何作用。(对于maxElements
也是如此。我认为这必须是一个参考值,oldAmount
不太重要。@John3136我试过调试它,但我对调试还是新手,所以很遗憾,我无法找出导致崩溃的原因。您可以通过打印值来调试,以查看程序在不同点的运行距离和状态ts.代码不正确。您必须将数组声明为Airport**items
`我认为我的doubleSize函数用于调整数组大小可能是导致此问题的原因`我们将对其进行调试并确认情况属实!第一个明显的问题是:oldAmount
参数到doubleSize
应该是一个参考吗?如果不是,则设置它在最后一行没有任何作用。(对于maxElements
也是如此。我认为这必须是一个参考值,oldAmount
不太重要。@John3136我试过调试它,但我对调试还是新手,所以很遗憾,我无法找出导致崩溃的原因。您可以通过打印值来调试,以查看程序在不同点的运行距离和状态ts.代码不正确。您必须将数组声明为Airport**items
您认为它可能与分配到items[计数器]中的项目无关当counter==maxelements时?我的Airport类没有复制构造函数,因为我在该类中没有动态内存。我还需要复制构造函数吗?@xaxxon忽略了这一点——是的,当counter==maxelements时,在调用items[counter]之前,您肯定需要调整大小!您认为这与分配到items中无关吗[counter]当counter==maxelements时?我的Airport类没有复制构造函数,因为我在该类中没有动态内存。我还需要复制构造函数吗?@xaxxon忽略了这一点--是的,当counter==maxelements时,在调用items[counter]之前,您肯定需要调整大小!doubleSize(items,maxelements,oldAmount);如果(计数器==maxElements-1)