MST

星途 面试题库

面试题:C++复杂模板与友元类作用范围的深度剖析

设计一个C++模板类TemplateClass,在模板类中定义一个私有成员函数privateFunc。再定义一个非模板友元类FriendClass,使其能够访问TemplateClass实例化对象的privateFunc。请详细说明在模板实例化过程中,友元类作用范围的界定和可能遇到的问题,以及如何解决这些问题。
19.0万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
#include <iostream>

template <typename T>
class TemplateClass {
private:
    void privateFunc() {
        std::cout << "This is privateFunc in TemplateClass." << std::endl;
    }

    friend class FriendClass;
};

class FriendClass {
public:
    template <typename T>
    void accessPrivateFunc(TemplateClass<T>& obj) {
        obj.privateFunc();
    }
};

友元类作用范围的界定

  1. 友元声明:在TemplateClass模板类中,通过friend class FriendClass;声明FriendClass为友元类,这使得FriendClass的所有成员函数可以访问TemplateClass实例化对象的私有成员(包括privateFunc)。
  2. 作用范围:友元关系是针对具体的模板实例化类型而言的。例如,TemplateClass<int>实例化后的对象,FriendClass可以访问其私有成员;而TemplateClass<double>实例化后的对象,同样可以被FriendClass访问私有成员。这是因为友元声明是针对整个TemplateClass模板类,而不是针对特定的实例化类型分别声明。

可能遇到的问题及解决方法

  1. 问题:如果FriendClass也定义为模板类,如template <typename U> class FriendClass,并且希望它能访问TemplateClass的私有成员,那么在TemplateClass中的友元声明就需要修改为template <typename U> friend class FriendClass;。这种情况下,FriendClass的不同实例化(如FriendClass<int>FriendClass<double>)只能访问对应TemplateClass相同类型实例化(如TemplateClass<int>TemplateClass<double>)的私有成员,可能与原需求不符。
  2. 解决方法:保持FriendClass为非模板类,像上述代码实现的那样,这样一个FriendClass可以访问TemplateClass任何类型实例化对象的私有成员。同时,在FriendClass的成员函数中通过模板参数来接受不同类型的TemplateClass实例化对象,如accessPrivateFunc函数模板。这样既满足了FriendClass作为非模板类访问TemplateClass私有成员的需求,又能处理不同类型的TemplateClass实例化对象。