gpt4 book ai didi

c++ - 将局部对象复制到 vector

转载 作者:行者123 更新时间:2023-11-28 00:25:05 25 4
gpt4 key购买 nike

我有一个单例类,它包含一个带有数据的 vector 。我的问题是我想使用标准的 push_back() 方法向该 vector 添加数据。我有一个对象要保存在该 vector 中,但它是一个本地对象(在另一个类的方法中创建)。显然,在此方法结束时,局部变量将被删除,这很好,因为我对该数据执行了 push_back() 到 vector 。

现在,只要方法没有结束,它就可以正常工作。结束后数据就没了。这看起来很奇怪,因为 push_back() 应该使用复制构造函数吧?现在,我尝试通过引用、按值、作为指针和 C++11 中的移动构造函数将局部变量添加到 vector 中,但所有这些似乎都不起作用。

所以这是问题的分类设置:

  • ConnectionManager(持有 vector )
  • ClassA(它有一个带有本地 typeX 对象的方法)

因此,简而言之,我希望在 ClassA 的方法中创建的对象在该方法之后可用,但在 ConnectionManager 类的 vector 中可用。

编辑:这是我正在谈论的 typeX:

struct Connection
{
SOCKET socket;
PlayerData* pPlayerData;
};

socket 只是普通的 winsock SOCKET 变量,PlayerData* 是使用 Google 的 ProtocolBuffer 创建的自定义对象。

进一步编辑:

这就是我创建数据的方式:

Predefined::Connection connTemp;
connTemp.socket = 0;
connTemp.pPlayerData = data;
MultiplayerData::GetInstance()->AddPlayerToGame(connTemp);

connTemp.pPlayerData 是一个本地创建的变量,但它是作为指针创建的。

最佳答案

如果问题是您正在创建 PlayerData数据,并期望在函数退出后仍然可以使用相同的数据,看起来您应该使用 std::shared_ptr<PlayerData> 之类的类型而不是裸体 PlayerData* .

#include <vector>
#include <memory>
//..
class PlayerData
{
int x, y, z;
public:
PlayerData(int a1, int a2, int a3) : x(a1), y(a2), z(a3) {}
};

typedef std::shared_ptr<PlayerData> PlayerDataPtr;

struct Connection
{
SOCKET socket;
PlayerDataPtr pPlayerData;
};

typedef std::vector<Connection> ConnectionVector;

void foo()
{
auto data = std::make_shared<PlayerData>(1, 2, 3); // create data dynamically
//...
Connection connTemp;
connTemp.socket = 0;
connTemp.pPlayerData = data;
MultiplayerData::GetInstance()->AddPlayerToGame(connTemp); // this does the push_back
//...
}

pPlayerData现在是 shared_ptr ,那些拷贝 vector只会生成一个引用计数,相反,当这些拷贝被销毁时,引用计数会减少。当引用计数达到 0 时,然后 data确实会被删

如果你还没有调用 reset在共享指针上,这或多或少,你保证data您在 push_back 之前创建was done 将存在,只要 vector 中的那个条目没有被删除。

此外,我编辑了示例以显示更简单的 PlayerData类(class)。注意如何 make_shared被使用。

关于c++ - 将局部对象复制到 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25463795/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com