为了整洁起见,在另一个文件中定义前向声明的嵌套结构/class/枚举

Define forward declared nested struct / class / enum in another file for neatness

是否有任何好的方法可以将嵌套数据类型定义从容器中分离到另一个文件中?

我有一个 class,在 header 中定义了多个嵌套的 structs/class 枚举,它可能很长。

MyClass.h

#ifndef MYCLASS_H_
#define MYCLASS_H_
#include <stdint.h>

namespace my_namespace{

class MyClass {

public:

  enum class NestedEnumClass {
    VALUE1, VALUE2, VALUE3
  };

  struct NestedStruct {
    float a;
    float b;
    uint_fast16_t c;
  };

  struct SomeOtherNestedStruct {
    float a;
    float b;
    uint_fast16_t c;
  };

  struct AnotherNestedStruct {
    float a;
    float b;
    uint_fast16_t c;
  };

private:
  struct CombinedStruct {
    NestedStruct a;
    NestedStruct b;
    NestedStruct c;
    AnotherNestedStruct d;
    NestedEnumClass e;
  };

  uint8_t pin;
  CombinedStruct data_;

public:
  MyClass();
  NestedEnumClass someMethod(NestedStruct nestedStruct);

}; // MyClass class.

} // my_namespace namespace.

#endif /* MYCLASS_H_ */

为了使headershorter/neater,我最初考虑在MyClass定义header文件中转发声明数据类型并在单独的源中定义数据类型其中包括 header 文件。

但是,当我尝试实例化任何数据类型时,编译器正确地抱怨类型不完整。

我想我可以包括它 in-line,但它看起来很糟糕:
MyClass_DataTypes.inc

public:
enum class NestedEnumClass {
    VALUE1, VALUE2, VALUE3
  };

struct NestedStruct{
  float a;
  float b;
  uint_fast16_t c;
};

struct SomeOtherNestedStruct {
  float a;
  float b;
  uint_fast16_t c;
};

struct AnotherNestedStruct {
    float a;
    float b;
    uint_fast16_t c;
  };

private:
struct CombinedStruct {
  NestedStruct a;
  NestedStruct b;
  NestedStruct c;
  AnotherNestedStruct d;
  NestedEnumClass e;
};

已修改MyClass.h

#ifndef MYCLASS_H_
#define MYCLASS_H_
#include <stdint.h>

namespace my_namespace{

class MyClass {

#include "MyClass_DataTypes.inc" // In-line include.

private:
  uint8_t pin;
  CombinedStruct data_;

public:
  MyClass(){};
  NestedEnumClass someMethod(NestedStruct nestedStruct);

}; // MyClass class.

} // my_namespace namespace.

#endif /* MYCLASS_H_ */

此外,我的 IDE (Eclipse) 不够聪明,无法查看 include 以进行动态代码检查,因此我需要在 class 定义中转发声明它们,甚至虽然没有它们编译得很好。

以下是我可能会采用的方法。

剧情简介:

  1. 为内部 classes

  2. 创建另一个命名空间
  3. 根据需要将内部 class 的名称导入我的外部 class 界面

像这样:

#ifndef MYCLASS_IMPL_H_
#define MYCLASS_IMPL_H_

#include <cstdint>

namespace my_namespace {
    namespace MyClassImpl {

        enum class NestedEnumClass {
            VALUE1, VALUE2, VALUE3
        };

        struct NestedStruct {
            float a;
            float b;
            uint_fast16_t c;
        };

        struct SomeOtherNestedStruct {
            float a;
            float b;
            uint_fast16_t c;
        };

        struct AnotherNestedStruct {
            float a;
            float b;
            uint_fast16_t c;
        };

    }
}
#endif

#ifndef MYCLASS_H_
#define MYCLASS_H_
#include <stdint.h>

namespace my_namespace{

    class MyClass {

    public:
        using NestedEnumClass = MyClassImpl::NestedEnumClass;
        using NestedStruct = MyClassImpl::NestedStruct;
        using SomeOtherNestedStruct = MyClassImpl::SomeOtherNestedStruct;
        using AnotherNestedStruct = MyClassImpl::AnotherNestedStruct;


    private:
        struct CombinedStruct {
            NestedStruct a;
            NestedStruct b;
            NestedStruct c;
            AnotherNestedStruct d;
            NestedEnumClass e;
        };

        uint8_t pin;
        CombinedStruct data_;

    public:
        MyClass();
        NestedEnumClass someMethod(NestedStruct nestedStruct);

    }; // MyClass class.

} // my_namespace namespace.