gpt4 book ai didi

c++ - 获取派生初始化列表中父级的地址

转载 作者:太空宇宙 更新时间:2023-11-04 14:05:49 25 4
gpt4 key购买 nike

是否有一种标准且安全的方法来获取子构造函数初始化列表中基类之一的地址?

这是我想做的:

我有多个类提供一些功能来处理缓冲区(void*、长度),并且我有多个类保存数据(c 样式结构)。我想用最少的代码将两者结合起来提供给用户。这是我的想法:

//Parent1 is POD (old c-style structure)
struct Parent1{/*C style stuff*/};

//Parent2 and Parent3 are NOT POD (virtual functions, copy constructors, ...)
class Parent2{public: Parent2(void*, size_t);/*stuff*/};
class Parent3{public: Parent3(void*, size_t);/*stuff*/};

/*order of inhertiance is not guranteed, it could be Parent2, Parent2, Parent3*/
struct Child1 : public Parent1, public Parent2, public Parent3
{
Child1()
: Parent2((Parent1*)this, sizeof(Parent1)),
Parent3((Parent1*)this, sizeof(Parent1))
{
}

//using self() instead of this is trick which I don't prefer to use.
const Child1* self()const{return this;}
};

这可以很好地编译 gcc,但会在 visual studio 上发出警告,稍后我会尝试其他嵌入式编译器。我正在寻找可以通过 MISRA C++ checks 的标准解决方案, polyspace检查和 any other static analysis tool .

编辑:

Visual Studio 警告:警告 C4355:“this”:用于基本成员初始化列表

最佳答案

在构造函数列表中,通常的转换有效,因此 Derived* 隐式转换为 Base*。没有任何工作。 (前提是被调用函数或构造函数需要这种类型的转换;对于 void*,您会得到一个等价的 reinterpret_cast)。

但是,您必须注意生命周期问题。在构造过程中,该类是半初始化的,因此使用这个或它的任何转换形式可能会导致使用稍后将被初始化的部分。这就是你收到警告的原因。对于您的情况,它可能适用也可能不适用。

我通常只允许存储从this 传递的指针,实际使用将在稍后进行。

不要使用 C 风格的转换来代替 static_cast!而且您采用 void* 闻起来很糟糕,请考虑采用类型化指针并废弃所有强制转换,只保留隐式转换。特别是因为没有看到恢复丢失的类型信息的设施。

关于c++ - 获取派生初始化列表中父级的地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17009245/

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