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

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

本文关键字:声明 结构 枚举 定义 嵌套 简洁 文件 另一个      更新时间:2023-10-16

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

我有一个类,在一个标头中定义了多个嵌套结构/类枚举,这个标头可能很长

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_ */

为了使头更短/更整洁,我最初考虑在MyClass定义头文件中向前声明数据类型,并在包括头文件的单独源中定义数据类型。

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

我想我可以把它放在一行中,但它看起来很可怕:
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,所以我需要在类定义中转发声明它们,即使没有它们它也能很好地编译。

以下是我可能会如何处理它。

简介:

  1. 为内部类创建另一个命名空间

  2. 根据需要将内部类的名称导入外部类的接口

类似这样的东西:

#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.