gpt4 book ai didi

c++ - 通过指向实例的静态指针访问成员变量

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

我有一个类,其中包含指向该类所有实例的指针的静态 vector 。当我通过静态 getter 方法访问成员变量时,有时会得到错误的结果。

代码:
hpp 文件:

class ObjectID {
public:
ObjectID();
float getShininess() const { return m_shininess; }
static const std::shared_ptr<ObjectID> getID(unsigned long);
private:
float m_shininess;
static std::vector<std::shared_ptr<ObjectID>> s_ids;
}

cpp 文件:

static std::mutex s_mutex;
std::vector<std::shared_ptr<ObjectID>> ObjectID::s_ids = {};

const std::shared_ptr<ObjectID> ObjectID::getID(unsigned long id) {
std::lock_guard<std::mutex> lock(s_mutex);
std::shared_ptr<ObjectID> ptr = s_ids.at(id - 1);
return ptr;
}

ObjectID::ObjectID()
: m_shininess(50.f)
{
std::lock_guard<std::mutex> lock(s_mutex);
s_ids.emplace_back(this);
}

我怀疑是不是和我用了两个线程有​​关。但是添加互斥体并没有改变任何东西。

为澄清起见,一个线程创建 ObjectID,另一个线程调用

ObjectID::getID(id)->getShininess();

我并不总是得到 50,有时我得到 1,而且我从不改变 m_shininess。有什么想法吗?

编辑:

ObjectIDs 是在另一个类中创建的,它有一个 ObjectIDs vector 。

m_objects.emplace_back();

最佳答案

您的 vector 包含 shared_ptr,但您将指向 ObjectID (this) 的原始指针放入其中。由于 shared_ptr 可以从编译的原始值构建,但它可能没有按照您的意愿进行。特别是,如果 ObjectID 通过其他方式被破坏,您将在该 vector 中得到野指针。我不确定这是否是您问题的原因,但至少值得怀疑。

我不知道您的确切要求,但也许这样的事情会有所帮助?

class ObjectID
{
public:
static std::shared_ptr<ObjectID> Create()
{
auto created = std::make_shared<ObjectID>();
s_ids.push_back(created);
return created;
}

private:
ObjectID()
{
// as before
}
};

关于c++ - 通过指向实例的静态指针访问成员变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23251907/

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