gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 02:32:27 27 4
gpt4 key购买 nike

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

我有一个包含多个嵌套结构/类枚举的类,该类在 header 中定义可能很长。

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

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

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

我想我可以将它包含在内,但它看起来很糟糕:
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) 不够聪明,无法查看包含以进行动态代码检查,因此我需要在类定义中转发声明它们,即使没有它们也能正常编译。

最佳答案

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

概要:

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

  2. 根据需要将内部类的名称导入到我的外部类的接口(interface)中

像这样:

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

关于c++ - 为了整洁起见,在另一个文件中定义前向声明的嵌套结构/类/枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36428604/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com