【问题标题】:Is it possible to have C struct as a member of C++ class?是否可以将 C 结构作为 C++ 类的成员?
【发布时间】:2021-06-15 23:12:29
【问题描述】:

假设我有以下纯 C 结构

typedef struct
{
  uint16_t id;
  uint32_t address;
  uint8_t type;
} Config;

typedef struct
{
  Config cfg; 
  uint32_t ready;
} Instance;

我的问题是是否可以定义一个具有Instance 类型属性的 C++ 类 即

class A
{
    public:
      A();
           
    private:
       Instance instance;   
};

如果是这样,编译器如何注意到 Instance 是纯 C 结构?是否需要使用A类构造函数的初始化部分来初始化instance

【问题讨论】:

  • 你应该阅读Standard Layout Type
  • 在 c++ 中,您的 ConfigInstance 与其他类一样。或者他们真的来自C?只是因为一个常见的误解是用struct 声明的类与在C++ 中通过class 声明的类有根本的不同
  • 有可能吗?是的。编译器如何注意到它是一个普通的 C 结构?为什么要重要?如果是这样,您可以将Instance 结构的声明包含在extern "C" { ... } 块中。是否有必要使用初始化部分...?如果你想初始化instance 成员,可以使用它,就像任何其他成员一样,但它不是必需
  • 在 C++ 中,structclass 是声明类型的同义词。两者之间的唯一区别是struct 具有public 默认值,class 具有private 默认值。 (对于成员和继承。)在 C++ 中,两者都实例化对象。与(例如)C# 或 D 相比,它们没有被语言区别对待,它们区别对待 classstruct

标签: c++ c class struct


【解决方案1】:

不,你不需要使用构造函数来初始化。 编译器知道它是“结构”数据类型,因为您是这样定义的。 纯 C 结构也是有效的 c++ 结构,所以没有什么叫做纯 c 结构。 在此处了解有关编译器的更多信息:https://www.freecodecamp.org/news/c-compiler-explained-what-is-the-compiler-and-how-do-you-use-it/

【讨论】:

    【解决方案2】:

    是的,可以将结构定义为类的属性。最好只在构造函数中初始化结构的所有字段。您还可以使用结构的动态对象

        Instance * instance;
        instance = new Instance;
        memset(instance,0,sizeof(Instance));
    

    在构造函数中初始化所有属性总是一个好习惯,这样你总是知道默认值是什么

    【讨论】:

    • 我很确定这里的memset 是多余的。
    • @DanM。拜托,你能解释一下你为什么这么认为吗?我没有看到构造函数将简单数据类型成员设置为任何内容,所以我认为它们未初始化......
    • @U.W.抱歉,我将第二行误读为 instance = new Instance();,这更有意义(并且不需要 memset)。当前代码是正确的(如果不是最好的样式)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多