我正在处理一组子类(例如SprocketTypeA
,SprocketTypeB
和SprocketTypeC
)到基类(例如Sprocket
)。子类是描述Sprocket
的不同方式,其方式与在不同单位或不同坐标系中描述测量的方式相同。换句话说,SprocketTypeA
的特定实例可以在特定转换下等效表示为SprocketTypeB
或SprocketTypeC
对象。
因此,对于每个其他类型的toSprocketTypeX()
对象,每个子类都有一个Sprocket
函数是很自然的。例如。 SprocketTypeA sta; SprocketTypeB stb = sta.toSprocketTypeB();
。
问题似乎是每种类型的Sprocket
在编译之前必须知道所有其他类型的Sprocket
对象的构造函数,但所有这些类型的Sprocket
必须知道所有其他类型Sprocket
的构造函数,依此类推。
以下是该情况的一些示例骨架代码。请注意,列出的前向声明不能解决问题,因为toSprocketTypeX()
函数必须在其实现中构造SprocketTypeX
对象。
Sprocket
基类
#ifndef SPROCKET_HPP
#define SPROCKET_HPP
class Sprocket {
public:
...
private:
...
};
#endif
SprocketTypeA
(Sprocket
子类)
#ifndef SPROCKETTYPEA_HPP
#define SPROCKETTYPEA_HPP
#include <Sprocket.hpp>
#include <SprocketTypeB.hpp>
#include <SprocketTypeC.hpp>
class SprocketTypeB;
class SprocketTypeC;
class SprocketTypeA: public Sprocket {
public:
...
SprocketTypeB toSprocketTypeB() const;
SprocketTypeC toSprocketTypeC() const;
};
#endif
SprocketTypeB
(Sprocket
子类)
#ifndef SPROCKETTYPEB_HPP
#define SPROCKETTYPEB_HPP
#include <Sprocket.hpp>
#include <SprocketTypeA.hpp>
#include <SprocketTypeC.hpp>
class SprocketTypeA;
class SprocketTypeC;
class SprocketTypeB: public Sprocket {
public:
...
SprocketTypeA toSprocketTypeA() const;
SprocketTypeC toSprocketTypeC() const;
};
#endif
SprocketTypeC
(Sprocket
子类)
#ifndef SPROCKETTYPEC_HPP
#define SPROCKETTYPEC_HPP
#include <Sprocket.hpp>
#include <SprocketTypeA.hpp>
#include <SprocketTypeB.hpp>
class SprocketTypeA;
class SprocketTypeB;
class SprocketTypeC: public Sprocket {
public:
...
SprocketTypeA toSprocketTypeA() const;
SprocketTypeB toSprocketTypeB() const;
};
#endif
一种可能的解决方案是返回Sprocket
指针(例如Sprocket* toSprocketTypeX()
),但这对我来说有点过分了。我对此问题的解决方案或支持toSprocketTypeX()
模式的其他设计持开放态度。