C++模板-34-类模板中成员函数的创建时机

冷不防 2023-02-25 10:23 13阅读 0赞

这篇来学习下类模板中普通函数的创建时机。如果是普通的类的成员函数,在类的实例化对象创建过程中就可以创建成员函数。但是在类模板中,成员函数是不会里面创建。因为这里T这个类型如果没有被确定,成员函数是无法创建的,而是这个成员函数在调用的时候才被创建。下面使用代码来证明这个结论。

类模板中,成员函数是在被调用的时候才创建

代码如下

  1. #include <iostream>
  2. #include <string>
  3. using namespace std;
  4. class Person1
  5. {
  6. public:
  7. void showPerson1()
  8. {
  9. cout << "Person1 show" << endl;
  10. }
  11. };
  12. class Person2
  13. {
  14. public:
  15. void showPerson2()
  16. {
  17. cout << "Person2 show" << endl;
  18. }
  19. };
  20. //类模板
  21. template <class T>
  22. class myClass
  23. {
  24. public:
  25. T obj;
  26. // 类模板中的成员函数
  27. void fun1()
  28. {
  29. obj.showPerson1();
  30. }
  31. void fun2()
  32. {
  33. obj.showPerson2();
  34. }
  35. };
  36. int main()
  37. {
  38. //test01();
  39. system("pause");
  40. return 0;
  41. }

这段代码是编译是没有问题,不会报错。来看看这个类模板myClass中有两个成员函数,第一个showPerson1() 一个showPerson2(). 但是对象obj 是T,还没有被确定是Person1对象还是Person2对象,所以当前在编译阶段这两个成员函数都没有报错。

接下来,如果我们在test01()中,确定T的类型是Person1,但是我们也想要调用showPerson2()这个成员函数,这个时候就会编译报错。

  1. #include <iostream>
  2. #include <string>
  3. using namespace std;
  4. class Person1
  5. {
  6. public:
  7. void showPerson1()
  8. {
  9. cout << "Person1 show" << endl;
  10. }
  11. };
  12. class Person2
  13. {
  14. public:
  15. void showPerson2()
  16. {
  17. cout << "Person2 show" << endl;
  18. }
  19. };
  20. //类模板
  21. template <class T>
  22. class myClass
  23. {
  24. public:
  25. T obj;
  26. // 类模板中的成员函数
  27. void fun1()
  28. {
  29. obj.showPerson1();
  30. }
  31. void fun2()
  32. {
  33. obj.showPerson2();
  34. }
  35. };
  36. void test01()
  37. {
  38. myClass<Person1> m;
  39. m.fun1();
  40. m.fun2();
  41. }
  42. int main()
  43. {
  44. test01();
  45. system("pause");
  46. return 0;
  47. }

报错内容如下(在vs code软件下截图)

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTE1NDE5NDY_size_16_color_FFFFFF_t_70

字面意思是,Person1这个类没有showPerson2这个成员函数,原因就是我们在test01中创建的m这个对象,已经确定是按照Person1这个类的类型创建,在50行我们就不能调用fun2()这个方法,注销这个方法就可以编译运行。

同理,如果在test01()函数中,我们创建类模板对象,参数确定是Person2类型的话,第49行m.fun1()也会报类似的错误。

发表评论

表情:
评论列表 (有 0 条评论,13人围观)

还没有评论,来说两句吧...

相关阅读