C ++在另一个标识符下的标题中使用包含的类

m0r0n

我面临的一个问题是,包含的(外部)头文件中的已声明类名与我自己的头文件中的已声明类名冲突。但基本上,我想用包含的类来构成我的类。在Golang中,一种解决方案是使用称为导入声明的功能

  • 我该如何实现:

    • 而不重命名我自己的声明(或修改我自己的声明的使用者)?
    • 而不使用继承(优先考虑组成而不是继承)?
    • 并且不更改外码?
  • 正确的术语是什么?

我已经在搜索多个主题和论坛,但无法提出解决方案。我到目前为止尝试过的(以及在下面的代码中可以看到的)是用自定义名称空间包围包含的标头。但是,当我访问包含类的方法时,这会导致令人讨厌的链接问题(请参见下文)。我是C ++的新手,所以我对如何实现这一点的详尽解释感到非常高兴。

外部头文件(“ some / sensor.h”):

class Sensor {
 public:
  Sensor(unsigned char a, unsigned char b);
 /*some definitions...*/
};

我的声明(“ sensor.h”):

namespace Lib {
#include "some/sensor.h"
};

class Sensor {
 private:
  Lib::Sensor s; /* use foreign object as member */
 public:
  Sensor();
  void init(unsigned char p);
};

收到如下错误:

In function `Sensor::init(unsigned char)':
  undefined reference to `Lib::Sensor::Sensor(unsigned char, unsigned char)'
  /* ...and so on... */
collect2: error: ld returned 1 exit status
巴鲁克

[备注]对于将来的读者:

请查看评论,因为它们能更好地反映答案的全部情况。@ Baruch的以下回答为您提供了快速解决此问题的方法。但是,正如评论中所建议的那样,对于外部库的作者来说,可能是一个糟糕的设计选择。

@Baruch的原始答案:

您应该将代码放在命名空间中,而不是外部代码中

#include "some/sensor.h"

namespace MyLib {
  class Sensor {
   private:
    ::Sensor s; /* use foreign object as member */
   public:
    Sensor();
    void init(unsigned char p);
  };
}

链接错误是由以下事实引起的:您实际上声明了一个新类型Lib::Sensor,该类型未在任何地方定义。中定义的类some/sensor.cppSensor,不是Lib::Sensor

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

C# - 在另一个类中使用参数调用一个类

创建一个 C++ 类并在另一个包含 ndk android 中的 JNI 方法的 C++ 类中使用该类

在C ++中使用Assignment运算符重载将一个类对象的数据复制到另一个类对象时出错

在C ++中,如何在另一个嵌套类中使用嵌套类类型(两个嵌套类在同一外部类下)

需要一个标识符 - C

在C ++中的另一个类中使用模板类

在另一个类 C++ 中包含一个类对象

不能在另一个类 C# 中使用方法

在C ++中使用另一个头文件中的抽象类

在 C++ 中的另一个 .h 文件中使用类中的方法

C#:如何在另一个类中使用可索引属性?

如何在 C# 中使用另一个类更改变量

在 C# 的另一个类中使用方法返回

在不使用C#中使用ODBC.DataReader的情况下将数据传递到另一个类

C ++使用另一个类的函数

在一个类中使用一个函数来更改另一个类中的变量的值C ++

如何独立于 C++ 中声明的位置在另一个类函数中使用类?

使用另一个类C ++构造一个类

对包含另一个派生类的C ++类的继承

无限重复,直到在 QT 中使用 C++ 在另一个窗口中按下按钮

在Visual Studio中使用C ++类-未声明的标识符错误

在Objective c中使用Swift类。发生未声明的标识符错误

从Java到C ++:如何在另一个自定义类中使用一个自定义类var?

C ++-如何在另一个类中使用私有构造函数实例化对象

如何在C ++中的另一个模板函数中使用属于模板化类的嵌套类型?

如何在 C# 中使用来自另一个类的初始化实例对象?

在 C# 中使用接口而不是继承时覆盖另一个类的虚拟方法?

如何在 C++ 中使用具有另一个类对象的构造函数?

c ++如何从另一个项目使用一个类