我想知道哪些可以重新使用具有相应methods
版本的friend
代码?例如,在下面给出的示例中,doSomething
和initDoSomething
方法都执行相同的计算,因此它们的实现几乎相同。这样做的最佳方式是重用代码?
template < typename T >
class CFoo;
template < typename T > CFoo<T> doSomething( double );
template < typename T >
class CFoo{
public:
...
friend CFoo<T> doSomething< >( double );
CFoo<T> initDoSomething( double );
};
欢迎任何建议; - )
我想要达到的目标是:
myFooObject1 = doSomething(3.0);
,无需必须初始化对象,或者:
myFooObject1.doSomething(3.0);
答案 0 :(得分:1)
一般来说,如果函数需要访问类的私有数据成员,则应该将其作为类的方法而不是友元函数。在某些特定情况下,您可能希望拥有友元函数,例如operator>>
的with和overloaded版本等,以便在对象和其他标准C ++接口(如流)之间创建公共接口。独立友元函数的另一个常见用途是创建单个函数接口,该接口将以某种方式进行参数化,但是您希望保持该函数的接口相同(即,单个模板函数可能需要多个不同的类类型,但您希望以任何实例化版本调用该函数。一般而言,将函数作为类的朋友只是因为它们可以访问类的私有数据成员,这打破了类首先为其私有数据成员创建的数据封装的概念。
在你的情况下,你还没有明确解释为什么doSomething
必须是朋友而不是方法......因为它现在就是函数声明,似乎没有为什么它不能成为CFoo
的公共方法。其次,如果您尝试为doSomething
函数初始化全局状态,则需要使initDoSomething
成为类的静态函数而不是方法,以便每个版本的{{1}初始化为CFoo<T>
的调用,而不仅仅是doSomething
的单个实例。就目前而言,您必须初始化CFoo<T>
的每个实例,然后才能与CFoo<T>
一起使用。在语义上没有意义,因为doSomething
之前创建doSomething
实例,然后您可以在该实例上调用CFoo<T>
来初始化它以调用initDoSomething
。
答案 1 :(得分:0)
在C ++中实现代码重用的方法是简单地将公共代码分解为(可能是参数化的)共享函数。
在您的情况下,我假设initDoSomething
访问私有成员(否则,为什么它是成员函数?)。因此,在您的情况下,您的共享函数可能需要两个参数,initDoSomething
调用它将私有成员作为参数传递给共享函数。