我是一个在C ++和指针中丢失的Java程序员:D
我有一个指向Bucket-Objects的指针数组
Bucket<E>* index = new Bucket<E>[2];
我像这样初始化它:
index[0] points to Bucket1
index[1] points to Bucket2
然后我希望将数组的大小加倍并链接其他条目,如下所示:
index[0] points to Bucket1
index[1] points to Bucket2
index[2] points to Bucket1
index[3] points to Bucket2
到目前为止我有这个代码,它会生成Bucket-Objects的副本,我不希望这样!
for (size_t i = 0; i < newSize; ++i)
{
if (i < oldIndexSize)
newIndex[i] = index[i];
else
newIndex[i] = index[i - oldIndexSize];
}
答案 0 :(得分:2)
我有一个指向Bucket-Objects的指针数组
不,你有一个指向Bucket对象数组的指针。指向Bucket对象的指针数组如下所示:
Bucket<E> * index[2];
动态分配给bucket对象的指针数组将按如下方式声明:
Bucket<E> ** index = new Bucket<E>*[N];
但你应该使用的是一个存储桶对象的共享指针向量,如下所示:
std::vector<std::shared_ptr<Bucket<E>>> index;
答案 1 :(得分:1)
不要重新发明轮子。如果需要可调整大小的数组,请使用std::vector<Bucket<E> >
。如果您不希望复制存储桶,则必须使用一些间接寻址。例如,使用智能指针:
std::vector<std::shared_ptr<Bucket<E>>> index {std::make_shared<Bucket<E>>()/*, ...*/}
答案 2 :(得分:1)
我是一个在C ++和指针中丢失的Java程序员:D
在现代C ++中,很少使用原始指针。您应该更喜欢智能指针(例如shared_ptr
或unique_ptr
)。这有几个好处,比如帮助使代码异常安全,简化代码(例如资源被自动销毁和释放,不需要调用显式{{ 1}})等。
我有一个指向Bucket-Objects的指针数组
Bucket * index = new Bucket [2];
如果您共享存储在阵列中的delete
个实例,则可以使用Bucket
。否则,如果存在共享语义,则可能需要使用vector<unique_ptr<Bucket>>
。您可以使用vector<shared_ptr<Bucket>>
方法将vector::push_back()
的新实例添加到向量中,该实例将动态增长。
如果您选择使用Bucket
智能指针,请使用shared_ptr<>
而不是原始Bucket
分配make_shared
的实例。
在Visual C ++团队中工作的STL维护者有一个非常有趣的STL lessons on Channel 9系列。您可能需要考虑part 1 (sequence containers)和part 3 (smart pointers)。
答案 3 :(得分:0)
如果它是一个指针数组,它将不会创建对象的副本,它将只是一个指针的副本,似乎这个代码可以完成你想要的东西。