【发布时间】:2016-07-06 17:53:34
【问题描述】:
我正在尝试编写一个其对象相互了解的类(即有一个指向所有对象的指针)。关于智能指针和静态成员,我无法理解实现这个想法的某些方面。
这个类可以被认为是一个游戏对象,它需要能够访问其他游戏对象的成员函数和属性。
据我所知,实现所需设计的常用方法是静态向量,其中包含指向其他对象的指针。如果通过原始指针操作,任务不是很复杂:
GameObject.h:
#pragma once
#include <vector>
class GameObject
{
private:
static std::vector< GameObject* > objects;
public:
GameObject()
{
objects.push_back(this);
}
};
GameObject.cpp:
#include "GameObject.h"
std::vector< GameObject* > GameObject::objects = {};
这实际上可以满足我的需求。但是如果我想使用智能指针,事情对我来说并不那么简单。从this question 和 Meyers 的“Effective Modern C++”一书中,我发现了std::enable_shared_from_this 和shared_from_this()。但是,另外,the reference 明确指出,shared_from_this() 仅允许在对象已由 std::shared_ptr<> 拥有的情况下使用。
因此不可能像以前一样在构造函数中简单地推入静态向量this 指针(或在其上构造的std::shared_ptr)。我发现的允许设计的最小代码集如下:
GameObject.h:
#pragma once
#include <vector>
#include <memory>
class GameObject : public std::enable_shared_from_this<GameObject>
{
private:
static std::vector< std::shared_ptr<GameObject> > objects;
public:
GameObject() {}
void emplace_ptr()
{
objects.emplace_back(shared_from_this());
}
};
GameObject.cpp:
#include "GameObject.h"
std::vector< std::shared_ptr<GameObject> > GameObject::objects = {};
main.cpp:
#include "GameObject.h"
int main(int argc, char* argv[])
{
std::shared_ptr<GameObject> game_object{ new GameObject{} };
game_object->emplace_ptr();
return 0;
}
所以我显然有义务在外面的某个地方创建一个指向对象的指针,然后显式调用一个方法来将指针推送到静态向量(因为我不允许在构造函数中这样做)。
我的印象是所需的代码变得不必要地复杂(比较原始指针的情况),或者我正在做一些荒谬的事情。
- 我努力让对象相互了解是否有意义 有吗?这是一个常见问题还是其他一些方法通常是 拍了吗?
- 静态向量是解决问题的好方法吗?
- 如何使用智能指针构造此类向量,但最好是,
无需外部干预,无需创建
特殊功能
emplace_ptr()有什么用途?
【问题讨论】:
-
你可以通过构造构造函数
private来摆脱enable_share_from_this,并提供静态构造函数来提供向量。 -
@Jarod42,我猜你的意思是静态命名构造函数(或创建函数),否则我同意 100%。
标签: c++ c++11 pointers static smart-pointers