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

标签 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,我们可以这样使用:

#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::fooX::barX::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/

相关文章:

c++ - 用另一个新语句重置动态数组,需要先删除吗?

c++ - 如何检查 std::filesystem::copy 是否结束?

javascript - 单击同级时从导航中删除类

c++ - Qt #include 不使用外部库

linker - 静态库和动态库: Confusion

c++ - 简化模板参数

c++ - 模板常量/非常量方法

Swift 通过 Init 传递多个参数

class - 如何从 JPA 实体名称中获取 Class?

ios - 如何手动将 Swift 静态库集成到 Objective-C 或 Swift 项目中而不将其添加为子项目