假设我们需要编写一个我们打算在程序中使用的函数库,那么我们可以通过以下方式编写它。
在 .h 文件中我们声明函数(mylibrary 可以是我们希望的任何文件名) 假设 sum 是我们希望在我们的库中拥有的函数
int sum(int x, int y);
然后我们将有一个 .cpp 文件,它将定义函数如下:
#include "mylibrary.h"
int sum(int x, int y){ return x+y; }
现在我们希望在我们的程序中使用这个函数,比如 myprog.cpp,我们可以这样使用:
#include
#include "mylibrary.h"
int main()
{
cout<<sum(10,20)<<endl;
return 0;
}
我的问题是我们能否像对函数那样对类做一些类似的事情,即
我们可以在 .h 文件中声明类吗:
class X;
class Y;
然后在 .cpp 中定义类:
#include"myclasses.h"
class X
{
public:
int m;
};
class Y
{
public:
int n;
};
然后在我们的程序中使用这些类,例如 myprog.cpp,如下所示:
#include"myclasses.h"
int main()
{
class X myX;
myX.m = 0;
return 0;
}
我试过这个并得到错误聚合'X myX'具有不完整的类型并且无法定义。
如果我将整个定义放在 myclasses.h 文件中,那么它可以正常运行而不会出错。
最佳答案
你可以把所有的方法放在.cpp
文件中,但是你必须有一个“完整”的类声明在头文件中。也就是说,您可以这样做:
// X.h
#ifndef _X_H
#define _X_H
class X {
int data;
void internal_method();
public:
void foo();
void bar();
};
#endif // X.h
然后您可以在中定义
文件,但你不能这样做或类似的事情:X::foo
、X::bar
和X::internal_method
。 cpp
// X.h
#ifndef _X_H
#define _X_H
// This code is incorrect and will not even compile
class X;
public void X::foo();
public void X::bar();
#endif // X.h
这是 C++ 的基本限制,是的,这意味着您不能更改数据成员或添加或删除方法 - 甚至是私有(private)方法 - 除非重新编译所有内容。 pimpl hack解决这个问题,但有其自身的问题。
(您可能已经注意到 class X;
本身 是一个可以编写的有效内容。这是类的“不完整”声明,它允许您声明涉及 X 对象的指针和引用的东西,但不是 X 对象本身。例如,这个头文件是有效的:
// Y.h
#ifndef _Y_H
#define _Y_H
class X;
class Y {
X& ex;
public:
Y(X& ex) : ex(ex) {}
void foo();
void bar(X& fx);
};
#endif // Y.h
这可能是一件有用的事情,例如减少需要包含其他头文件的头文件的数量,并打破相互依赖循环(想象一下如果 class X
有一些采用对 Y 参数的引用的方法,如果没有这样的功能,你根本无法编写它。)
关于c++ - 如何用 C++ 编写类库,就像我们为函数编写的类库一样,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39430819/