使用std :: containers存储引用,gnu c ++ 98

时间:2016-10-12 17:48:50

标签: c++ pointers vector reference

我在另一篇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] 

1 个答案:

答案 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