用于简化类构造函数的前向声明容器

时间:2010-01-27 19:34:39

标签: c++

我在一个巨大的遗产项目上工作。有许多类基本上只创建一次(它们应该是单例,但很好),然后传递给程序中的几乎所有其他类。

所以有很多像这样的代码,其中的类在其构造函数中有几乎无穷无尽的指针列表

Foo(A* a, B * b, C * c, ...) 
   : Foo2(a,b,c),
     _a(a),
     _b(b),
     _c(c),
     ...,
{} 

我想我可以清理它,如果我使用一个类来包含所有指针并使用前向声明来避免创建更多包含依赖项。每个类都可以使用getter然后提取他们需要的任何东西并包含适当的头。

//No includes required
class A;
class B;
class C;
class InterfaceMngr
{
public:
      InterfaceMngr(A * a, B * b, C* c)
       :_a(a),
        _b(b),
        _c(c)
      {
      }
     A * GetA() const { return _a; }
     B * GetB() const { return _b; }
     C * GetC() const { return _c; }

private:
     A * _a;
     B * _b;
     C * _c;
};

所以foo示例现在看起来更像是

Foo(Interface * inf) 
 : Foo2(inf),
   _a(inf->GetA()),
   _b(inf->GetB()),
   _c(inf->GetC())
{}

不错的是,每当有新的类API进入图片时我就可以将它添加到Interface中,而不需要再次更改几百个构造函数....

有没有人看到这个问题?我觉得我过度暴露了对某些类的访问,但它确实简化了编辑代码。

2 个答案:

答案 0 :(得分:2)

我认为你正在研究Context设计[反]模式。

答案 1 :(得分:2)

不要那么快地为缺乏单身人士而悲伤。通过将对象实例传递给构造函数,可以更轻松地执行单元测试。

如果你要聚合那样的类指针,也许你应该考虑创建逻辑组而不是一个大型的catch-all接口聚合。这样可以防止一切都依赖于其他一切。

Facade pattern也可能对您有用。