我在另一篇SO帖子中发现了这个评论,关于在std容器中存储引用:
这是C ++语言的一个缺陷。你不能拿一个地址 参考,因为尝试这样做会导致地址 被引用的对象,因此你永远不会得到一个指针 一个参考。 std :: vector使用指向其元素的指针,所以 存储的值需要能够被指向。你必须这样做 改为使用指针。
帖子:
Why can't I make a vector of references?
假设这是正确的,有人可以解释为什么我的下面的代码有效吗?我并不是想暗示这个人是错的,我只是想确保我明白什么是可能的,什么不是。
我的代码:
#include <iostream>
#include <vector>
#include "stdio.h"
struct TestStruct
{
int x;
int y;
};
class TestClass {
public:
TestClass(int x, int y);
int getX();
int getY();
private:
int mX;
int mY;
};
TestClass::TestClass(int x, int y)
{
mX = x;
mY = y;
}
int TestClass::getX()
{
return mX;
}
int TestClass::getY()
{
return mY;
}
int main()
{
// test struct
std::vector<TestStruct> structVec;
TestStruct testStruct;
testStruct.x = 10;
testStruct.y = 100;
structVec.push_back(testStruct);
testStruct.x = 2;
testStruct.y = 200;
structVec.push_back(testStruct);
testStruct.x = 3;
testStruct.y = 300;
structVec.push_back(testStruct);
for (int i = 0; i < structVec.size(); i++)
{
printf("testStruct [%d] - [x: %d, y: %d] \n", i, structVec[i].x, structVec[i].y);
}
// test object
std::vector<TestClass> objVec;
objVec.push_back(*new TestClass(10, 100));
objVec.push_back(*new TestClass(20, 200));
objVec.push_back(*new TestClass(30, 300));
for (int i = 0; i < objVec.size(); i++)
{
printf("objVec [%d] - [x: %d, y: %d] \n", i, objVec[i].getX(), objVec[i].getY());
}
}
输出:
testStruct [0] - [x: 10, y: 100]
testStruct [1] - [x: 2, y: 200]
testStruct [2] - [x: 3, y: 300]
objVec [0] - [x: 10, y: 100]
objVec [1] - [x: 20, y: 200]
objVec [2] - [x: 30, y: 300]
答案 0 :(得分:1)
当你编写这样的代码时:
objVec.push_back(*new TestClass(10, 100));
您正在堆上创建new
TestClass
实例,然后使用*
取消引用它,然后在调用push_back
时将其复制到向量中}。
但是你泄漏在堆上使用TestClass
分配的原始new
对象。
如果你想存储指针(智能指针)而不是vector<shared_ptr<TestClass>>
个实例,你可能想要使用vector<unique_ptr<TestClass>>
或TestClass
(你确定吗?) ?)。
请注意,引用向量为vector<TestClass&>
,这是错误的。
P.S。正如您所引用的C ++ 98&#34;在标题中,你不能拥有unique_ptr
,因为它需要C ++ 11移动语义。 shared_ptr
成为C ++ 11的标准;你仍然可以在C ++ 98中使用boost::shared_ptr
。