Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何用c+编写类库+;就像我们为函数编写的一样_C++_Class_Static Libraries - Fatal编程技术网

C++ 如何用c+编写类库+;就像我们为函数编写的一样

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,我们

假设我们需要编写一个函数库,我们打算在程序中使用它,那么我们可以用下面的方法编写它

在.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;
}
#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以获取您的回复。下次发帖时我会记住这一点:)。