假设我们需要编写一个打算在程序中使用的函数库,然后可以通过以下方式编写它。
在.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 ++的一个基本限制,是的,这意味着您不能更改数据成员或添加或删除方法(甚至是私有方法),而无需重新编译所有内容。该PIMPL黑客解决了这个问题,但有自己的问题。
(您可能已经注意到,仅凭其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的参数,而没有像这样的功能,您根本无法编写)。)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句