为了简洁起见,在另一个文件中定义前向声明的嵌套结构/类/枚举
Define forward declared nested struct / class / enum in another file for neatness
有什么好方法可以将嵌套的数据类型定义从容器中分离到另一个文件中吗?
我有一个类,在一个标头中定义了多个嵌套结构/类枚举,这个标头可能很长
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,所以我需要在类定义中转发声明它们,即使没有它们它也能很好地编译。
以下是我可能会如何处理它。
简介:
-
为内部类创建另一个命名空间
-
根据需要将内部类的名称导入外部类的接口
类似这样的东西:
#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.
相关文章:
- 在哪里声明结构运算符重载
- 如何正确转发声明结构"using XXX"?
- 在C++我可以在不在本地声明结构的情况下将结构作为指针传递吗?
- 在 for 循环中声明结构是否合法C++?
- 为什么我们可以创建一个模板类结构,其中包含许多与声明结构时指定的参数不同的参数
- 当声明结构数组时,CPPCHECK停止对整个文件的分析
- C++ - 声明结构和类时不允许使用不完整的类型
- 在声明末尾或 main 中声明结构或类实例之间的区别
- 在模板类中声明结构,未为成员函数定义
- C++ .h 文件中转发声明结构,并在.cpp文件中定义结构
- 如何在C++中声明结构变量
- 在 C 中声明结构的新实例
- 在类内部声明结构
- 为什么可以用相同的名称声明结构和非结构
- 在结构定义内部声明结构的堆栈
- 为什么在声明结构时不能初始化结构中的向量成员?
- 在c++头文件中声明结构体
- 如何声明结构体?
- c++中声明结构体的问题
- 只在库cpp中有定义的前向声明结构