通过静态指针访问成员变量实例
我有一个类的静态向量指向类的所有实例的类。 当我通过静态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(this)中。 由于shared_ptrs可以从编译的原始文件构建,但它可能没有按照你想要的来做。 特别是,如果ObjectID通过其他方式被销毁,那么您将在该向量中使用wild指针。 我不确定这是你问题的原因,但至少是可疑的。
我不知道你的具体要求,但也许这样的事情会有所帮助?
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
}
};
链接地址: http://www.djcxy.com/p/96375.html
上一篇: Accessing member variables through static pointer to instance