C++ 如何用c+编写类库+;就像我们为函数编写的一样
假设我们需要编写一个函数库,我们打算在程序中使用它,那么我们可以用下面的方法编写它 在.h文件中,我们声明函数(mylibrary可以是我们希望的任何文件名) 假设sum是我们希望在库中使用的函数C++ 如何用c+编写类库+;就像我们为函数编写的一样,c++,class,static-libraries,C++,Class,Static Libraries,假设我们需要编写一个函数库,我们打算在程序中使用它,那么我们可以用下面的方法编写它 在.h文件中,我们声明函数(mylibrary可以是我们希望的任何文件名) 假设sum是我们希望在库中使用的函数 int sum(int x, int y); 然后我们将有一个.cpp文件,该文件将定义函数,如下所示: #include "mylibrary.h" int sum(int x, int y){ return x+y; } 现在我们希望在我们的程序中使用这个函数,比如myprog.cpp,我们
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;
}
#include"myclasses.h"
int main()
{
class X myX;
myX.m = 0;
return 0;
}
然后在.cpp中定义类,如下所示:
#include"myclasses.h"
class X
{
public:
int m;
};
class Y
{
public:
int n;
};
然后在我们的程序中使用这些类,比如myprog.cpp,如下所示:
#include
#include "mylibrary.h"
int main()
{
cout<<sum(10,20)<<endl;
return 0;
}
#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
然后,您可以在.cpp
文件中定义X::foo
、X::bar
和X::internal_method
,但您不能执行此操作或类似操作:
// 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++的一个基本限制,是的,它意味着你不能改变数据成员或者添加或移除方法——甚至私有方法——而不需要重新编译所有的东西。这项工作围绕这一点展开,但也有其自身的问题
(您可能已经注意到,类X;
本身就是一个可以编写的有效对象。这是类的“不完整”声明,允许您声明涉及指向X对象的指针和引用的内容,而不是X对象本身。例如,此头文件是有效的:
这可能是一件有用的事情,例如减少需要包含其他头文件的头文件的数量,打破相互依赖循环(想象一下,如果class X
有一些方法采用了引用-Y参数,如果没有这样的特性,您根本无法编写这些参数)您可以将所有方法放在.cpp
文件中,但必须在头文件中有类的“完整”声明。也就是说,您可以这样做:
// X.h
#ifndef _X_H
#define _X_H
class X {
int data;
void internal_method();
public:
void foo();
void bar();
};
#endif // X.h
然后,您可以在.cpp
文件中定义X::foo
、X::bar
和X::internal_method
,但您不能执行此操作或类似操作:
// 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++的一个基本限制,是的,它意味着你不能改变数据成员或者添加或移除方法——甚至私有方法——而不需要重新编译所有的东西。这项工作围绕这一点展开,但也有其自身的问题
(您可能已经注意到,类X;
本身就是一个可以编写的有效对象。这是类的“不完整”声明,允许您声明涉及指向X对象的指针和引用的内容,而不是X对象本身。例如,此头文件是有效的:
这可能是一件有用的事情,例如减少需要包含其他头文件的头文件的数量,打破相互依赖的循环(想象一下,如果类X
有一些引用Y参数的方法,如果没有这样的功能,你根本无法编写它)。是的,你可以这样做;但是类的完整声明(类似于声明函数)涉及声明其所有成员。(有关详细信息,请参阅,不过我想您已经很熟悉了。)
如果您只是通过编写classfoo“向前声明”类在不完全声明它的情况下,您仍然可以传递指向它的指针,但不能引用它的任何成员,包括它的构造函数(即使是编译器生成的构造函数,因为它们不是无条件生成的;不是所有类都有它们)。请注意,转发声明甚至不足以告诉编译器实例将有多大(sizeof
)。是的,您可以这样做;但是类的完整声明(类似于声明函数)涉及声明其所有成员。(有关详细信息,请参阅,不过我想您已经很熟悉了。)
如果您只是通过编写classfoo“向前声明”类在不完全声明它的情况下,您仍然可以传递指向它的指针,但不能引用它的任何成员,包括它的构造函数(即使是编译器生成的构造函数,因为它们不是无条件生成的;不是所有类都有它们)。请注意,转发声明甚至不足以告诉编译器实例将有多大(sizeof
)。请显示一些代码。因为是的,您可以在头文件中声明类,并在相应的cpp文件中编写它们的实现。用你的问题发布你的代码,并清楚地标记错误发生的地方。错误的确切文本是重要的;不要总结信息。@UnholySheep&WhozCraig:tnx以获取您的回复。下次发布任何问题时,我会记住这一点:)。请显示一些代码。因为是的,您可以在头文件中声明类,并在相应的cpp文件中编写它们的实现。用你的问题发布你的代码,并清楚地标记错误发生的地方。错误的确切文本是重要的;不要总结信息。@UnholySheep&WhozCraig:tnx以获取您的回复。下次发帖时我会记住这一点:)。