【发布时间】:2018-05-20 07:14:06
【问题描述】:
上下文
上下文由三个类组成:
- 抽象父级(例如Player)
- 孩子(例如TapePlayer)
- 持有人(例如MyMachine)
持有者有一个成员变量,它是父类的shared_ptr<...>,它的设置器接受子类的shared_ptr<...>s。
我的 getter 看起来像这样
shared_ptr<Parent> getChildPtr() {
return parentPtr;
};
但是它返回一个指向父对象的指针,并且不能访问子方法。
如果我想做如下的事情
holder.getChildPtr()->childMethod();
// ERROR! No member named 'childMethod' in 'Parent'
我应该如何实现 getter 来获取指向子类而不是父类的指针?
代码
整个代码如下所示:
class Player {
public:
Player(){};
virtual ~Player{};
virtual void play() = 0;
}
class TapePlayer : public Player {
public:
TapePlayer(){};
virtual ~TapePlayer{};
void play() { ... };
void rewind() { ... };
}
class MyMachine {
public:
MyMachine(); //
~MyMachine();
void setPlayer(shared_ptr<Player> p) {
playerPtr = p;
}
shared_ptr<Player> getPlayer() {
return playerPtr;
};
private:
shared_ptr<Player> playerPtr;
}
MyMachine machine; // the holder
shared_ptr<TapePlayer> tapePtr(new TapePlayer()); // pointer to child
machine.setPlayer(tapePtr); // set holder with pointer to child
machine.getPlayer()->rewind(); // -- ERROR! No member named 'rewind' in 'Player'
// if I want to get the player of that machine to rewind I need
// to dynamic_cast<TapePlayer>() ...
我很确定有比强制转换为子类型更好的方法。有什么想法吗?
编辑
这是一个非常简单的例子。我真正想做的是:
我的持有者类名为 Clip。一个剪辑播放一些东西,无论是 图像,视频,图像序列,某种处理 OpenCv,一个矢量形状...任何可以显示的东西。
所有这些类型的东西都是玩家。
我不在乎剪辑包含什么类型的播放器。我只是想让它展示给我看。但是,有些播放器需要在运行时进行调整,例如 OpenCv,它需要调整参数以获得最佳处理。我无法在父类中实现所有子类的所有方法,这对我来说毫无意义。为什么视频需要有调整 OpenCv 参数的方法?
我所需要的只是两者都具有“可播放”方法,并且能够将它们存储在map<string, PlayerPtr> 中以随时访问它们或更改剪辑所持有的播放器。
【问题讨论】:
-
你可以为你的父类添加一个虚拟倒带方法(只是声明)。
标签: c++ inheritance shared-ptr getter-setter getter