繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM