我有一个类层次结构如下:
class BaseSession : public boost::enable_shared_from_this<BaseSession>
class DerivedSessionA : public BaseSession
class DerivedSessionB : public BaseSession
Run Code Online (Sandbox Code Playgroud)
在派生类函数中,我经常调用这样的函数:
Func(boost::dynamic_pointer_cast<DerivedSessionA>(shared_from_this()));
Run Code Online (Sandbox Code Playgroud)
由于我正在与shared_ptr管理会议,这工作正常.最近,我发现我shared_ptr对这种情况的使用不是最佳的.这是因为这些会话是单个对象,每个客户端维护一个套接字.如果重新连接套接字,则会话副本将成为僵尸.
作为解决方法,我开始通过shared_ptr引用传递而不是复制.这解决了僵尸问题.
理想情况下,我觉得我应该unique_ptr用来存储会话,然后将引用传递给其他函数.这打开了一大堆蠕虫.
如何将基类unique_ptr对象转换为派生类unique_ptr对象?unique_ptr以下行的版本是什么?
Func(boost::dynamic_pointer_cast<DerivedSessionA>(shared_from_this()));
Run Code Online (Sandbox Code Playgroud)
我只想要一个会话对象的副本,其他一切都应该是参考.
比如说你有:
class Plant {
public:
...public accessors, etc ...
}
Run Code Online (Sandbox Code Playgroud)
然后你有一个特定的植物类:
class Broccoli : public Plant
{
public:
Broccoli(int i);
virtual ~Broccoli();
inline BroccoliSprite* getPlantSprite() { return _plantSprite; };
private:
BroccoliSprite* _plantSprite;
};
Run Code Online (Sandbox Code Playgroud)
在某些时候,Broccoli对象存储在向量中:std::vector<Plant> vPlants;
访问我使用的向量及其元素: inline std::vector<Plant>& getPlants() { return vPlants; };
访问:
for (int f=0; f < _f.getPlants().size(); f++)
{
Plant _p1 = _f.getPlants().at(f);
cocos2d::CCSprite* s = _p1.getPlantSprite();
....
}
Run Code Online (Sandbox Code Playgroud)
我希望能够用getPlantSprite()它来显示给用户,但编译器告诉我:No member named 'getPlantSprite' in 'Plant'
这是真的,但是向量中的对象是类型Plant并且包含一个成员变量,它是我需要的精灵,getter返回它.
我不明白的是如何获得访问权限 getPlantSprite()
我想有一点是我可以改变 …