Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.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++_Header_Namespaces_Alias_Declaration - Fatal编程技术网

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

C++ C++;使用另一标识符下标题中包含的类,c++,header,namespaces,alias,declaration,C++,Header,Namespaces,Alias,Declaration,我面临一个问题,来自包含(外部)头文件的声明类名和我自己头文件的声明类名冲突。 但基本上我想用包含的类组成我的类。 在Golang中,一个解决方案是使用名为的功能 我怎样才能做到这一点: 没有重命名我自己的声明(或修改我自己声明的使用者) 不使用继承(更喜欢组合而不是继承) 在不改变外国代码的情况下 什么是正确的术语 我已经搜索了好几个帖子和论坛,但没有找到解决方案。 到目前为止,我所尝试的(以及从下面的代码中可以看到的)是用一个自定义名称空间来包围包含的头。但当我访问包含类的方法时,这

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

  • 我怎样才能做到这一点:

    • 没有重命名我自己的声明(或修改我自己声明的使用者)
    • 不使用继承(更喜欢组合而不是继承)
    • 在不改变外国代码的情况下
  • 什么是正确的术语

我已经搜索了好几个帖子和论坛,但没有找到解决方案。 到目前为止,我所尝试的(以及从下面的代码中可以看到的)是用一个自定义名称空间来包围包含的头。但当我访问包含类的方法时,这会导致严重的链接问题(见下文)。 我对C++有点新的,所以我会很高兴地阐述解释,如何实现这一点。p> 外部头文件(“some/sensor.h”):

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
类传感器{
公众:
传感器(无符号字符a、无符号字符b);
/*一些定义*/
};
我的声明(“sensor.h”):

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
名称空间库{
#包括“部分/传感器.h”
};
类传感器{
私人:
Lib::Sensor s;/*将外部对象用作成员*/
公众:
传感器();
void init(无符号字符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的原始答复: 您应该将代码放在命名空间中,而不是外部代码

#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.cpp
中定义的类是
sensor
,而不是
Lib::sensor

您不能仅将类定义放在命名空间中;您还需要定义其中的成员函数。您的思路是正确的,但您需要朝相反的方向走。我正在尝试重新声明外部库的类,这样我就可以在自己的代码中使用相同的类名(因为这是最直观的)。那么我怎样才能做到这一点呢?有两种方法可以做到这一点:1)修改库,或2)说服库的作者更改它。或者,你可以像其他人一样——重命名你的类或者把它放在命名空间中——继续你的生活。使用mynamespace::Sensor如果您想在使用自己的类时保存一些击键。@molbdnilo好的,明白了!谢谢你的澄清。显然我会听从你的建议。我只是完全理解了这件事(以及语言的工作方式)。我将为图书馆作者撰写一篇文章,但现在我将继续你的推荐@m0r0n如果库在某种程度上是标准的或基本的,则可能是有意的。在这种情况下,库可能会考虑为自己保留的全局命名空间,并可能要求您为自己的代码使用命名空间。例如,据我所知,Arduino在全局名称空间中声明了它的标准库。只有当两个库声明相同的名称空间而不尊重另一个库的声明时,这才会成为问题。如果这不是一个非常小的库,您不太可能让作者更改名称空间,因为它会破坏使用它的所有现有代码。但这意味着,一旦在外部库中定义了一个名称,如果不使用名称空间,该名称就不能在我自己的代码中用作标识符?所以,我不能仅仅使用“Sensor”作为标识符,因为外部库保留了该名称,现在阻止我使用相同的(可理解且可读性很强的)名称?@m0r0n如果库通过外部链接声明某个完全限定的名称,如您的示例中的
::Sensor
,然后,您将无法在同一命名空间范围内为其他内容再次使用相同的名称。没有办法做到这一点。这就是为什么库将它们的声明放入全局名称空间不是一个好主意。库应该使用特定于库的命名空间。你需要在库的每个源文件中添加定义<代码>命名空间LIB { } /Cuffe,并强迫它使用不同的完全限定名称。@ Walnok OK,所以如果我理解你的观点,那么,库的作者是一个糟糕的设计选择,对吗?@ M0R0n,假定它实际上是C++库。(正如您的示例代码所示)。C库是不同的,因为C中没有名称空间(但在C中,库通常会在它通过外部链接声明的名称中添加前缀,以避免冲突)。