通过静态指针访问成员变量实例

我有一个类的静态向量指向类的所有实例的类。 当我通过静态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

下一篇: pthread with without static member function