使用返回兄弟子类对象的函数设计子类

时间:2016-04-07 17:57:22

标签: c++ oop inheritance forward-declaration

我正在处理一组子类(例如SprocketTypeASprocketTypeBSprocketTypeC)到基类(例如Sprocket)。子类是描述Sprocket的不同方式,其方式与在不同单位或不同坐标系中描述测量的方式相同。换句话说,SprocketTypeA的特定实例可以在特定转换下等效表示为SprocketTypeBSprocketTypeC对象。

因此,对于每个其他类型的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

SprocketTypeASprocket子类)

#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

SprocketTypeBSprocket子类)

#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

SprocketTypeCSprocket子类)

#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()模式的其他设计持开放态度。

0 个答案:

没有答案