Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在C++;_C++_Arrays_Pointers_Dynamic - Fatal编程技术网

C++ 在C++;

C++ 在C++;,c++,arrays,pointers,dynamic,C++,Arrays,Pointers,Dynamic,我有一个类,其中的项指向Airport对象。动态数组的大小从10开始。当total大于数组的大小并且我已读入数据以填充数组时,我需要将数组的大小加倍,将旧数组中的元素复制到新大小的数组中,然后删除旧数组。数组将继续读入数据,然后调整大小,并继续执行此操作,直到文件中的所有数据都读入项数组 没有发生错误,但问题是当我运行程序时,它崩溃了。我认为我的doubleSize函数调整数组大小可能是造成这种情况的原因。有没有办法解决这个问题 class AirportList { private: A

我有一个类,其中的项指向Airport对象。动态数组的大小从10开始。当
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)