像我们为函数编写的那样,如何用c ++编写类库

卡皮尔

假设我们需要编写一个打算在程序中使用的函数库,然后可以通过以下方式编写它。

在.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::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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何用C#编写的类库引用用C ++编写的Windows运行时组件?

来自分类Dev

编写可移植类库的语言

来自分类Dev

用python编写数据库类

来自分类Dev

用python编写数据库类

来自分类Dev

如何像我们在 SQL 中实现的那样在 firebase 实时数据库中实现分页?

来自分类Dev

我们如何编写在C ++中返回多个值的函数

来自分类Dev

QTest-为基于Qt的库编写测试并公开类

来自分类Dev

我们如何用角度2编写基本单元测试?

来自分类Dev

如何将数据库数据打印成 4x4 格式,就像我们在购物网站上看到的那样?

来自分类Dev

如何在任何类中创建比较器函数,就像我们在C ++ STL中创建priority_queue一样

来自分类Dev

我们如何使用CsvHelper库编写分隔符之类的分隔符?

来自分类Dev

我们是否可以直接导入非静态方法而无需导入类(就像我们对静态方法所做的那样)?

来自分类Dev

我们如何为动态打印的锚标记编写访问函数

来自分类Dev

如何用参数编写lambda函数?C ++

来自分类Dev

我们如何编写用于打印的单元测试?

来自分类Dev

我们如何在 Kotlin Exposed 中编写查询?

来自分类Dev

如何用Dart编写静态类?

来自分类Dev

有没有办法像我们使用 XPath 阅读一样来编写 XML?

来自分类Dev

我应该如何为我的类编写构造函数

来自分类Dev

如何围绕表达式模板编写第三方库包装器类

来自分类Dev

如何编写类以执行数据库操作-Spring整数

来自分类Dev

为类编写Typescript接口

来自分类Dev

如何从非类函数c ++编写类中函数?

来自分类Dev

我是否必须为C ++中的派生类编写相同的构造函数?

来自分类Dev

如何将其编写为类组件?

来自分类Dev

在React类中应如何编写函数?

来自分类Dev

C ++类:编写函数的不同方法

来自分类Dev

在ViewController中编写类

来自分类Dev

为我的网站编写<address>标记的正确方法,以提供我们公司的联系方式

Related 相关文章

  1. 1

    如何用C#编写的类库引用用C ++编写的Windows运行时组件?

  2. 2

    编写可移植类库的语言

  3. 3

    用python编写数据库类

  4. 4

    用python编写数据库类

  5. 5

    如何像我们在 SQL 中实现的那样在 firebase 实时数据库中实现分页?

  6. 6

    我们如何编写在C ++中返回多个值的函数

  7. 7

    QTest-为基于Qt的库编写测试并公开类

  8. 8

    我们如何用角度2编写基本单元测试?

  9. 9

    如何将数据库数据打印成 4x4 格式,就像我们在购物网站上看到的那样?

  10. 10

    如何在任何类中创建比较器函数,就像我们在C ++ STL中创建priority_queue一样

  11. 11

    我们如何使用CsvHelper库编写分隔符之类的分隔符?

  12. 12

    我们是否可以直接导入非静态方法而无需导入类(就像我们对静态方法所做的那样)?

  13. 13

    我们如何为动态打印的锚标记编写访问函数

  14. 14

    如何用参数编写lambda函数?C ++

  15. 15

    我们如何编写用于打印的单元测试?

  16. 16

    我们如何在 Kotlin Exposed 中编写查询?

  17. 17

    如何用Dart编写静态类?

  18. 18

    有没有办法像我们使用 XPath 阅读一样来编写 XML?

  19. 19

    我应该如何为我的类编写构造函数

  20. 20

    如何围绕表达式模板编写第三方库包装器类

  21. 21

    如何编写类以执行数据库操作-Spring整数

  22. 22

    为类编写Typescript接口

  23. 23

    如何从非类函数c ++编写类中函数?

  24. 24

    我是否必须为C ++中的派生类编写相同的构造函数?

  25. 25

    如何将其编写为类组件?

  26. 26

    在React类中应如何编写函数?

  27. 27

    C ++类:编写函数的不同方法

  28. 28

    在ViewController中编写类

  29. 29

    为我的网站编写<address>标记的正确方法,以提供我们公司的联系方式

热门标签

归档