重用代码:使用非朋友方法的朋友方法

时间:2011-10-28 14:03:28

标签: c++ templates code-reuse

我想知道哪些可以重新使用具有相应methods版本的friend代码?例如,在下面给出的示例中,doSomethinginitDoSomething方法都执行相同的计算,因此它们的实现几乎相同。这样做的最佳方式是重用代码?

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);

2 个答案:

答案 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调用它将私有成员作为参数传递给共享函数。