为什么在CPP文件中需要范围解析操作符

时间:2017-01-15 22:30:10

标签: c++ scope include

为什么在我们已经包含LinkedList.h之后需要LinkedList :: List * LinkedList :: getMiddleNode()?据我所知,它应该导入所有文件变量(即struct List)和声明。

这是头文件。

class LinkedList{

private:
    struct List {
        int num;

        List* next;
    };
    List* head;

public:
    ...
    ...
    List* getMiddleNode();
};

现在这里是CPP档案。

#include <iostream>
#include "LinkedList.h"

LinkedList::List* LinkedList::getMiddleNode() {
    ...
    ...
    return node;
}

2 个答案:

答案 0 :(得分:1)

  

为什么在我们已经包含LinkedList.h之后需要LinkedList :: List * LinkedList :: getMiddleNode()?

因为编译器需要知道您正在定义类LinkedList的方法而不是独立函数。没有人会阻止你声明/定义独立函数以及这样的方法:

class LinkedList {
public:
    LinkedList::List* LinkedList::getMiddleNode();
    ...
};

LinkedList::List* getMiddleNode();

你怎么告诉编译器哪一个是哪个?

答案 1 :(得分:0)

  

为什么LinkedList::List* LinkedList::getMiddleNode()之后需要   我们已经包含了 LinkedList.h ?据我所知,包括它应该   导入所有文件变量(即struct List)和声明。

除了可以将非成员函数与其他地方的声明分开;如果你有多个具有相同功能名称的可见类怎么办?你如何在课堂上单独定义其成员函数?所以,这是C ++在类定义之外定义成员函数的方法。引用(强调我的):

  

[class.mem/4]如果成员函数的定义在词法之外是在其类之外   定义,成员函数名称应由其类限定   使用::运算符命名。 [注意:成员函数中使用的名称   定义(即在参数声明子句中包括   默认参数([dcl.fct.default])或在成员函数体中)   查找[basic.lookup]中描述的内容。 - 结束注释] [示例:

struct X {
  typedef int T;
  static T count;
  void f(T);
};
void X::f(T t = count) { }
     

f的成员函数class X在全局范围内定义;该   表示法X​::​f指定函数fclass X的成员   在class X的范围内。在函数定义中,参数   类型T是指T中声明的typedef成员class X   default参数count指的是声明的静态数据成员计数   在class X。 * - 结束示例] *