将类代码分离为头文件和cpp文件
我很困惑如何将一个简单类的实现和声明代码分离成一个新的头文件和cpp文件。 例如,我将如何分隔以下类的代码?
class A2DD { private: int gx; int gy; public: A2DD(int x,int y) { gx = x; gy = y; } int getSum() { return gx + gy; } };
类声明进入头文件。 添加#ifndef
包括警卫是非常重要的,或者如果您在MS平台上,您也可以使用#pragma once
。 另外我省略了私有的,默认情况下C ++类的成员是私有的。
// A2DD.h #ifndef A2DD_H #define A2DD_H class A2DD { int gx; int gy; public: A2DD(int x,int y); int getSum(); }; #endif
并在CPP文件中执行:
// A2DD.cpp #include "A2DD.h" A2DD::A2DD(int x,int y) { gx = x; gy = y; } int A2DD::getSum() { return gx + gy; }
一般来说你的.h包含了类的定义,这就是你所有的数据和所有的方法声明。 就像你的情况一样:
A2DD.h: class A2DD { private: int gx; int gy; public: A2DD(int x,int y); int getSum(); };
然后你的.cpp包含这样的方法的实现:
A2DD.cpp: A2DD::A2DD(int x,int y) { gx = x; gy = y; } int A2DD::getSum() { return gx + gy; }
基本上是函数声明/定义的修改语法:
a2dd.h
class A2DD { private: int gx; int gy; public: A2DD(int x,int y); int getSum(); };
a2dd.cpp
A2DD::A2DD(int x,int y) { gx = x; gy = y; } int A2DD::getSum() { return gx + gy; }
A2DD.h
class A2DD { private: int gx; int gy; public: A2DD(int x,int y); int getSum(); };
A2DD.cpp
A2DD::A2DD(int x,int y) { gx = x; gy = y; } int A2DD::getSum() { return gx + gy; }
这个想法是保留头文件中的所有函数签名和成员。
这将允许其他项目文件看到类如何看起来像,而不必知道实现。
除此之外,你可以在实现中包含其他头文件,而不是头文件。 这是非常重要的,因为头文件中包含的任何头文件将被包含(inheritance)在包含头文件的任何其他文件中。
您将声明留在头文件中:
class A2DD { private: int gx; int gy; public: A2DD(int x,int y); // leave the declarations here int getSum(); };
并将这些定义放在实现文件中。
A2DD::A2DD(int x,int y) // prefix the definitions with the class name { gx = x; gy = y; } int A2DD::getSum() { return gx + gy; }
你可以混合使用两个(例如在header中留下getSum()
定义)。 这是很有用的,因为它给了编译器更好的内联机会。 但是这也意味着更改实现(如果保留在标题中)可能会触发重新生成包含标题的所有其他文件。
请注意,对于模板,您需要将其全部保留在标题中。
通常你只在头文件中放置声明和真正的短内联函数:
例如:
class A { public: A(); // only declaration in the .h unless only a short initialization list is used. inline int GetA() const { return a_; } void DoSomethingCoplex(); // only declaration private: int a_; };