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

  • 我怎样才能做到这一点:
  • 而不重命名我自己的声明(或修改我自己声明的使用者)?
  • 并且不使用继承(更喜欢组合而不是继承)?
  • 并且不改变外国代码?
  • 对此的正确术语是什么?

  • 我已经搜索了几个主题和论坛,但找不到解决方案。
    到目前为止我尝试过的(以及在下面的代码中可以看到的)是用自定义命名空间包围包含的 header 。但这会导致令人讨厌的链接问题(见下文),当我访问包含类的方法时。
    我对 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
    

    最佳答案

    [备注] 致 future 读者:

    请查看评论,因为它们更好地反射(reflect)了答案的全貌。
    @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.cpp 中定义的类是 Sensor ,而不是 Lib::Sensor

    关于C++ 使用来自另一个标识符下的头文件的包含类,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59949501/

    10-10 22:00