gpt4 book ai didi

c++ - 将 C 风格结构与 C++ 混合

转载 作者:太空宇宙 更新时间:2023-11-04 04:34:09 24 4
gpt4 key购买 nike

我不是 C++ 期望的,正如您无疑会注意到的那样。但我正在尝试将一些旧的 C 代码“升级”为 C++。在此过程中,我试图将旧结构提升到类中。我发现这篇 Oracle 文章介绍了我正在尝试做的一些事情。

http://www.oracle.com/technetwork/articles/servers-storage-dev/mixingcandcpluspluscode-305840.html

但是有两件事。这篇文章没有解决我遇到的更复杂的案例。而我的“解决方法”似乎并没有带来一致的结果。所以我在这里介绍一些细节。

旧的 C 风格结构:

typedef struct
{
int ia;
float fa;
...
} Struct_A;

typedef struct
{
Struct_A sA;
int ib;
float fb;
...
} Struct_B;

C++
根据 Oracle 文章,我应该能够将 Struct_A 提升为一个类,并且仍然能够使用具有旧 C 函数的类版本。这显然是如何:

class CStruct_A : public Struct_A  // Inherits from C- Struct_A
{
public:
CStruct_A() : ia(0), fa(0.0f) {}
}

暂停。就在这里,我已经有一个问题。我似乎无法按照文章中和上面所示的那样初始化 C 结构元素。编译器不接受它。我必须将类(class)重写为:

class CStruct_A : public Struct_A
{
public:
CStruct_A()
{
ia = 0;
fa = 0.0f;
}
}

这是第一个问号。没什么大不了的,但是文章声称可以做到。

接下来,更棘手的问题。提升包含 Struct_A 成员的 Struct_B。我想确保 A 类的构造函数用于初始化变量。但我不确定如何强制执行。在我的 C++ 代码中,如果我有类似的东西:

{
CStruct_B *pCStrb = new CStruct_B();
...
}

B 类的构造函数被调用,但 A 类的构造函数没有被调用。我的解决方法很蹩脚......但这是我现在唯一能想到的。我在 A 类中声明了一个内部私有(private)函数 ini(),使 B 类成为 friend 并从 B 类的构造函数中调用 init()。

class CStruct_A : public Struct_A
{
friend class CStruct_B;

public:
CStruct_A() { init(); }

private:
void init()
{
ia = 0;
fa = 0.0f;
}
}

class CStruct_B : public Struct_B
{

public:
CStruct_B()
{
ib = 0;
fb = 0.0f;
static_cast<CStruct_A *>(&sA)->init();
}
}

我还有更多问题,但这可能已经太长了。

任何帮助将不胜感激。

最佳答案

我浏览了您引用的“Oracle 文章”,但在那篇文章中没有发现任何建议您可以按照您声称的文章描述的方式初始化基类,或者给出任何接近于您正在尝试编译的语法。

C++ 类的构造函数只能初始化其类的成员。它们不能直接从构造函数初始化父类(super class)的任何成员。

话虽如此,一些编译器可能会提供他们自己的特定于编译器的语言扩展。例如,gcc 5.1 将在 -std=c++11 模式下接受以下代码:

typedef struct
{
int ia;
float fa;
} Struct_A;

class CStruct_A : public Struct_A {

public:

CStruct_A() : Struct_A({
.ia=1,
.fa=0,
})
{
}
};

但是,这非常低效并且不是标准的 C++(因为 gcc 会在 -Wpedantic 模式下警告您)。

关于c++ - 将 C 风格结构与 C++ 混合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33005157/

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