重用代码:友元方法与非友元方法
Reusing code: friend methods with non-friend methods
我想知道,对于具有相应friend
版本的methods
,哪种代码可以重复使用?例如,在下面给出的例子中,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);
一般来说,如果函数需要访问类的私有数据成员,则应将其作为类的方法,而不是友元函数。在某些特定实例中,您可能希望拥有一个friend函数,例如operator>>
的with和重载版本等,以便在对象和其他标准C++接口(如流(之间创建一个通用接口。独立友元函数的另一个常见用途是创建一个函数接口,该接口将以某种方式参数化,但您希望保持该函数的接口不变(即,一个模板函数可能具有多个不同的类类型,但您想对任何实例化版本以相同的方式调用该函数(。不过,一般来说,将函数作为类的朋友,只是为了让它们可以访问类的私有数据成员,这打破了类最初为其私有数据成员创建的数据封装的整个想法。
在您的案例中,您没有明确解释为什么doSomething
必须是朋友而不是方法。。。就目前的情况来看,通过函数声明,似乎没有任何理由说明它不能成为CFoo
的公共方法。其次,如果您试图初始化doSomething
函数的全局状态,您将希望使initDoSomething
成为类的静态函数,而不是方法,这样CFoo<T>
的每个版本都会初始化为对doSomething
的调用,而不仅仅是CFoo<T>
的单个实例。按照目前的情况,您必须初始化CFoo<T>
的每个实例,然后才能将其与doSomething
一起使用。从语义上讲,这是没有意义的,因为doSomething
在您可以对该实例调用initDoSomething
以初始化它以调用doSomething
之前创建了一个CFoo<T>
实例。
在C++中实现代码重用的方法是将公共代码简单地分解为(可能是参数化的(共享函数。
在您的情况下,我假设initDoSomething
访问私有成员(否则,为什么它是成员函数?(。因此,在您的情况下,共享函数可能需要两个参数,initDoSomething
调用它,并将私有成员作为参数传递给共享函数。
- C++模板来检查友元函数的存在
- 模板类无法识别友元运算符
- 如何使用单独文件中的派生类访问友元函数对象
- 模板化的类和友元函数
- 为什么创建友元类的实例会导致"undefined reference to"错误?
- 如何在嵌套类中正确使用友元声明?
- 友元函数无法访问私有数据成员 (c++)
- 将子类方法声明为基类的友元
- 在模板类之外定义友元函数的正确方法是什么?
- 友元方法作为常量
- Scott Meyers关于首选非成员非友元方法的建议是否适用于对象构造?
- 如何访问友元类方法?
- 友元方法参数列表中的不同模板专用化
- 类定义交叉引用时如何声明友元方法
- 在C++中使用非友元方法重载 I/O 运算符 |&istream 和 &ostream 函数
- 在模板类中重载友元运算符方法
- 私有基类通过子类中的模板友元函数和模板方法影响成员访问
- c++中两个带友元方法的类
- 重用代码:友元方法与非友元方法
- 友元方法不能访问嵌套类