重用代码:友元方法与非友元方法

Reusing code: friend methods with non-friend methods

本文关键字:友元 方法 代码      更新时间:2023-10-16

我想知道,对于具有相应friend版本的methods,哪种代码可以重复使用?例如,在下面给出的例子中,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);

一般来说,如果函数需要访问类的私有数据成员,则应将其作为类的方法,而不是友元函数。在某些特定实例中,您可能希望拥有一个friend函数,例如operator>>的with和重载版本等,以便在对象和其他标准C++接口(如流(之间创建一个通用接口。独立友元函数的另一个常见用途是创建一个函数接口,该接口将以某种方式参数化,但您希望保持该函数的接口不变(即,一个模板函数可能具有多个不同的类类型,但您想对任何实例化版本以相同的方式调用该函数(。不过,一般来说,将函数作为类的朋友,只是为了让它们可以访问类的私有数据成员,这打破了类最初为其私有数据成员创建的数据封装的整个想法。

在您的案例中,您没有明确解释为什么doSomething必须是朋友而不是方法。。。就目前的情况来看,通过函数声明,似乎没有任何理由说明它不能成为CFoo的公共方法。其次,如果您试图初始化doSomething函数的全局状态,您将希望使initDoSomething成为类的静态函数,而不是方法,这样CFoo<T>的每个版本都会初始化为对doSomething的调用,而不仅仅是CFoo<T>的单个实例。按照目前的情况,您必须初始化CFoo<T>的每个实例,然后才能将其与doSomething一起使用。从语义上讲,这是没有意义的,因为doSomething在您可以对该实例调用initDoSomething以初始化它以调用doSomething之前创建了一个CFoo<T>实例。

在C++中实现代码重用的方法是将公共代码简单地分解为(可能是参数化的(共享函数。

在您的情况下,我假设initDoSomething访问私有成员(否则,为什么它是成员函数?(。因此,在您的情况下,共享函数可能需要两个参数,initDoSomething调用它,并将私有成员作为参数传递给共享函数。