[英]Accessing member variables through static pointer to instance
我有一个带有指向该类所有实例的指针的静态向量的类。 当我通过静态的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。 有任何想法吗?
编辑 :
ObjectID在另一个类中创建,该类具有ObjectID的向量。
m_objects.emplace_back();
您的向量包含shared_ptr,但是您将其中包含指向ObjectID(此)的原始指针。 由于shared_ptrs可以从原始代码构造而来,因此可以进行编译,但是它可能并没有按照您想要的去做。 特别是,如果通过其他方法破坏了ObjectID,则在该向量中最终将使用野生指针。 我不确定这是造成您问题的原因,但至少是可疑的。
我不知道您的确切要求,但是也许这样会有所帮助?
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
}
};
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.