动态数组 C++,新 Obj[size] 的麻烦只创建 1 个对象指针,而不是数组
Posted
技术标签:
【中文标题】动态数组 C++,新 Obj[size] 的麻烦只创建 1 个对象指针,而不是数组【英文标题】:Dynamic array C++, trouble with new Obj[size] creating only 1 Object pointer, not array 【发布时间】:2016-04-24 14:20:35 【问题描述】:我会尽量做到这一点。不,我不能使用向量。我在 hpp 中有一个像这样声明的现有数组:
Item *itemList[4];
然后,我需要稍后创建一个新大小的 Object 指针数组。 这是我的调整大小数组函数。它不起作用,因为在设置插槽 1 之后,它会用完插槽。这是因为 Visual Studio 将 **tempList 视为指向单个对象的单个指针。我错过了什么?:
void List::resizeList(int newSiz)
Item **tempList = new Item *[newSiz];
//Setup tempList
for (int arraySlot = 0; arraySlot < newSiz; ++arraySlot)
tempList[arraySlot] = NULL;
//Copy List
for (int listSlot = 0; listSlot < numArraySlots; listSlot++)
tempList[listSlot] = itemList[listSlot];
delete [] itemList; //Delete Original List
*itemList = *tempList; //Set new itemList
添加此屏幕截图以便您可以看到 Visual Studio 认为 tempList 只是一个指向单个 Item Object Pointer 的指针
enter image description here
#ifndef LIST_HPP
#define LIST_HPP
#include "Item.hpp"
class List
private:
Item *itemList[4]; //Array of 4 Item Object Pointers
int numItemsOnList; //Track number of Items on List
int numArraySlots; //Track Array Slots available for comparison on addToList
public:
List(); //Default 4 Objects
void addToList(string nam, string uni, int numBuy, double uniPrice);
void delFromList(string itemName); //Using Name for Lookup
void resizeList(int newSize); //Resize new array
void printList(); //Print current List
double calcTotalPrice(); //Calculate Total Price of items on list
bool itemExists(string);
;
#endif
【问题讨论】:
新建动态数组的方法是使用std::vector
。你为什么不使用它?
itemList2[0] = itemList[0]
, itemList2 是一个Item 对象数组。 itemList 是一个指向 Item 对象的指针数组。
谢谢,但您没有阅读我的评论吗?我不能使用矢量。我们在这里谈论的不是行业标准或最佳实践。如果必须使用此方法,我需要正确的方法来执行此操作。
好的,谢谢。但是,我的 resizeList 使用 **tempList 和 newItem*[size]。创建将与 Item *itemList[4] 啮合的对象的动态指针数组的正确方法是什么?
我无法在我的电脑上复制该问题。您确定 itemList
元素在使用之前已初始化吗?还有一件事delete [] itemList;
你不需要在这里使用delete
因为这个数组不是用new
操作符创建的。
【参考方案1】:
itemList
是静态创建的数组,您不能在运行时调整它的大小。你可能想要做的是使它成为一个双指针Item** itemList
,使用new
在你的类的构造函数中设置它的初始大小,调整它的大小,并在类被销毁时在类的destructor
处删除它.
试试这个:
List::List()
itemList=new Item*[4];//allocate its initial size in the constructor
List::~List()
delete[] itemList;//release the memory at the destructor
void List::resizeList(int newSiz)
Item **tempList = new Item *[newSiz];
//Setup tempList
for (int arraySlot = 0; arraySlot < newSiz; ++arraySlot)
tempList[arraySlot] = NULL;
//Copy List
for (int listSlot = 0; listSlot < numArraySlots; listSlot++)
tempList[listSlot] = itemList[listSlot];
delete [] itemList; //Delete Original List
itemList = tempList; //Set new itemList
我希望这会有所帮助。
【讨论】:
谢谢!明白了。我想当先前声明的数组试图变成动态数组时会有一些麻烦......以上是关于动态数组 C++,新 Obj[size] 的麻烦只创建 1 个对象指针,而不是数组的主要内容,如果未能解决你的问题,请参考以下文章