为简单起见,我说有一个对象管理器class A
来管理从同一个类class B
派生的对象之间的资源。
A
要求是这些:
1)一次只能有一个B
的实例,我们会current B
2)应该记住上一个B
的名称或枚举表示,以便在B
再次需要current B
时重新创建。
3)A
有资源a
,b
,c
,d
4)A
负责仅为current B
current B
提供current B
所需的资源{/ 1}}
目前的实施是这样的。我希望有一个更好的方法,因为所有的static_cast都让我烦恼。
class B
{
public:
void show()
}
class Recording : public B
{
}
class Camera : public B
{
}
class A
{
a a;
b b;
c c;
d d;
enum Benum
{
Recording,
Camera,
InputSource,
COUNT,
}
map<Benum, unique_ptr<B> Bmap;
B* currentB;
public:
void init()
{
Bmap[Benum::Recording] = make_uniqe ...
Bmap[Benum::Camera] = make_uniqe ...
...
}
switchB(Benum b)
{
switch(b)
{
case Benum::REcording
auto recording = static_cast<Recording>(Bmap[Benum::Recording].get());
recording->setup(a, b, c)
currentB = recording;
case Benum::Camera
auto camera = static_cast<CAmera>(Bmap[Benum::Camera].get());
camera->setup(b, c)
currentB = camera;
currentB->show();
这很好,但仅仅是为了工程挑战,还有更好的方法吗?对我而言,这似乎是一种代码味道。阅读本文,我必须明白枚举代表了对象。如果enum改变了整个班级就必须被触及。它似乎不容易维护。
此外,所有这些static_casting和类似的代码在switch语句中只有不同的设置似乎是代码气味