是否可以避免在实现文件中重复类名?

Ofe*_*Ron 19 c++ syntax class

有没有办法避免Graph::实现文件中的重复,但仍然将类拆分为头+实现?如:

头文件:

#ifndef Graph_H
#define Graph_H

class Graph {
public:
    Graph(int n);
    void printGraph();
    void addEdge();
    void removeEdge();
};

#endif
Run Code Online (Sandbox Code Playgroud)

实施档案:

Graph::Graph(int n){}
void Graph::printGraph(){}
void Graph::addEdge(){}
void Graph::removeEdge(){}
Run Code Online (Sandbox Code Playgroud)

Vik*_*pov 12

如果你想避免在printGraph,addEdge等前面输入"Graph ::",那么答案是"不",不幸的是.类似于C#的"部分类"功能在C++中是不可访问的,任何类的名称(如"Graph")都不是命名空间,它是一个范围.


小智 10

我猜这是为了避免大量的"不必要的打字".可悲的是,没有办法摆脱范围(正如许多其他答案告诉你的那样)然而我个人所做的是用我所有的函数原型定义好的行,然后复制/粘贴到实现文件然后ctrl-c您在剪切板上的ClassName ::并使用ctrl-v运行该行.


Luc*_*ore 5

不,没有.至少不是直接的.您可以选择预处理器技巧,但不要这样做.

#define IMPL Graph::

IMPL Graph(int n){}
void IMPL printGraph(){}
void IMPL addEdge(){}
void IMPL removeEdge(){}
Run Code Online (Sandbox Code Playgroud)

此外,你应该甚至不希望这样做.重点是什么.除了它是一个C++规则,它还会让你知道你实际上正在实现一个成员函数.

  • 你也可以在一个单独的文件中定义它们,并在类的主体中"#include"它们. (3认同)
  • 嗯,说“不要这样做……这是怎么回事!”真的明智吗? (2认同)

Ell*_*ith 5

一种选择是using。如果您的方法定义位于从未获得#included 的 cpp 文件中,那么using是安全的(不会影响其他文件):

foo.h:

class FooLongNameSpecialisationsParamaters
{
    int x_;

public:

    int Get () const;
    void Set (int);
};
Run Code Online (Sandbox Code Playgroud)

foo.cpp:

#include "foo.h"

using Foo = FooLongNameSpecialisationsParamaters;

int Foo::Get () const
{
    return x_;
}

void Foo::Set (int x)
{
    x_ = x;
}
Run Code Online (Sandbox Code Playgroud)

主要.cpp:

#include "foo.h"

int main ()
{
    //Foo foo; <-- error
    FooLongNameSpecialisationsParamaters foo;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)