在处理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 ++的好习惯,所以我很想知道其他人在这种情况下做了什么。
答案 0 :(得分:3)
如果X
和Z
正在做与该类相关的事情,那么将它们作为该类的成员函数(如果没有,则没有问题,因为它们的实现可以很容易地放到别处,在公众视野之外)。
如果他们不应该成为班级公共界面的一部分,那就让他们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)
如果您愿意,可以将X
和Z
功能移动到班级的私人会员功能中,并使用inline
修饰符对其进行标记。这将允许访问私人成员,同时难以从课外访问。
答案 3 :(得分:0)
我认为你的概念错了:
X()
和Z()
有共同代码,则这是一项设计改进。重构它们。M1(args)
工作正常,为什么要更改它?重构X()
和Z()
后,您可以在其他方法中使用它们。只需使用新的M2(args)
和X()
以及新Z()
方法中的新功能创建Y()
。答案 4 :(得分:0)
您可以将功能变为:
使用选项#2,您将无法访问该类的私有成员,这是一个大问题,可以通过传入所有(并且仅)所需的参数来缓解它,并返回值或使用输出参数(指针或引用)。