在C ++中将公共块提取到函数中

时间:2011-10-06 09:54:58

标签: c++

在处理C ++代码时,我一直在努力解决这个问题。

让我说我有一个方法做X,Y然后Z.现在我想介绍另一个应该做X,Y',Z的方法。如果那是普通的旧C代码,我会使用公共代码创建函数X()和Z(),声明它们static,以便编译器现在可以在需要时进行内联,因为这个“模块”中没有代码可以调用它们。然后,API的一部分方法看起来像

int M(args) {
   X(foo); // that could e.g. be "check args are valid".
   /* here comes M-specific code */
   Z(bar); // that could e.g. be "update_state"
}

int M2(args) {
   X(foo);
   /* here comes M2-specific code */
   Z(bar);
}

现在,如果我在C ++中执行相同操作,则X()和Z()不再能够访问类的protected / private成员。在.h和.cc文件之间交换以声明那些“帮助”X()和Z(),因为我继续编写代码以某种方式诱惑我只是复制/粘贴公共代码,所以我倾向于复制代替类,更接近.h中的(java)接口的东西 - 几乎没有成员变量 - 然后在.cc文件的class块中包含变量,API方法和“辅助”方法来自“界面”。

然而,我怀疑这是C ++的好习惯,所以我很想知道其他人在这种情况下做了什么。

5 个答案:

答案 0 :(得分:3)

如果XZ正在做与该类相关的事情,那么将它们作为该类的成员函数(如果没有,则没有问题,因为它们的实现可以很容易地放到别处,在公众视野之外)。

如果他们不应该成为班级公共界面的一部分,那就让他们private

如果令人困扰的是他们的功能签名出现在类定义中,那么有几种方法可以重构代码,这样就不会暴露实现细节。

一种常见的方法,例如,使用Pimpl idiom

另一种方法是,只在公共API中公开(抽象)接口,并从视图中隐藏实现类。这并不总是可行,但如果可行,它可能非常有效。

答案 1 :(得分:1)

如果我理解你正确的想要实现的是为两个以上的函数M()只编写两个函数X()和Z()。像其他评论建议的那样,将它们的成员函数标记为内联。

除了将X()和Z()作为成员函数实现之外,我将使用策略模式,你有一个像这样的函数M()

class ClassTest
{
  private:
    void X();
    void Y();

    Alogrithm* m_algorithm;

  public:
    void M();
    void setAlgorithm( Alogrithm* a ) { m_algorithm = a; }
}

void ClassTest::M()
{
  X();    
  m_algorithm->execute();    
  Z();
}

这消除了对第二功能M2()的需要。您只需要为m_algorithm设置一个setter,它是一个实现原始函数Y()的小对象。这样算法甚至可以在运行时更改。

答案 2 :(得分:0)

如果您愿意,可以将XZ功能移动到班级的私人会员功能中,并使用inline修饰符对其进行标记。这将允许访问私人成员,同时难以从课外访问。

答案 3 :(得分:0)

我认为你的概念错了:

  • 如果X()Z()有共同代码,则这是一项设计改进。重构它们。
  • 如果M1(args)工作正常,为什么要更改它?重构X()Z()后,您可以在其他方法中使用它们。只需使用新的M2(args)X()以及新Z()方法中的新功能创建Y()

答案 4 :(得分:0)

您可以将功能变为:

  1. 让他们成为班上的私人成员。
  2. 或者您可以将它们放在Impleatio文件中的匿名命名空间中。
  3. 使用选项#2,您将无法访问该类的私有成员,这是一个大问题,可以通过传入所有(并且仅)所需的参数来缓解它,并返回值或使用输出参数(指针或引用)。