使用其中的部分(对应于基类)初始化成员
Using parts of this (corresponding to base-class) to initialize a member
背景:我有这样的东西(但Z中的重要代码我不想更改,并且警告是全局启用的——我知道我可以禁用它(:
#pragma warning (error: 4355)
struct A;
struct B;
struct MapCompare {
A*the;
MapCompare(A*a):the(a) {;}
bool operator()(int,int) const;
};
class Z {
A a;
B b;
std::map<int,int,MapCompare> m;
public:
Z():m{MapCompare{&a}} {;}
...
};
但我想更改为在MapCompare中同时使用a和b。影响较小的变体似乎是:
#pragma warning (error: 4355)
struct A;
struct B;
struct AB {
A a;
B b;
};
struct MapCompare {
AB*the;
MapCompare(AB*ab):the(ab) {;}
bool operator()(int,int) const;
};
class Z : public AB {
std::map<int,int,MapCompare> m;
public:
Z():m{MapCompare{static_cast<AB*>(this)}} {;}
...
};
错误消息为:
错误C4355:"this":在基成员初始值设定项列表中使用
因此,Visual Studio 2019(16.9.5(抱怨在初始化器中使用this
,尽管我只想要初始化的基部分(请参阅构造函数初始化列表中的执行顺序(。
有没有办法告诉编译器这一点(而不仅仅是禁用警告(?我发现的工作是:
#pragma warning (error: 4355)
struct A;
struct B;
struct AB {
A a;
B b;
};
struct MapCompare {
AB*the;
MapCompare(AB*ab):the(ab) {;}
bool operator()(int,int) const;
};
class Z {
AB ab;
A&a;
B&b;
std::map<int,int,MapCompare> m;
public:
Z():m{MapCompare{&ab}},a(ab.a),b(ab.b) {;}
...
};
注意:我尝试搜索类似的问题,发现Initialize a reference-warning C4355:';这';:在基成员初始值设定项列表中使用但不同的是,我想提取已初始化的基类部分,这使其安全(只要成员按此顺序排列(。
考虑一下同样出错的情况:
class z {
int a = 5;
int num;
public:
z() :num(this->a) {}
};
根据文档"编译器警告C4355",此指针不能在基类的初始值设定项列表中使用。默认情况下,此警告处于关闭状态。该代码段的作用类似于提供的示例:CDerived((:CBase(this(。此对象未完全构造,(对于编译器(使用不安全。你需要给它一个例子。
相关文章:
- std::具有相同基类的类的变体
- 继承:构造函数,初始化C++11中基类的类C数组成员
- C++ 不能使用与私有基相同的类
- 如何在从抽象基派生的类中实现相同的方法?
- 指向基类派生类的 std::unique_ptr 的指针
- 对派生自同一基类的类实现冲突检查
- 将shared_ptr的向量复制到抽象基的派生类
- c++:需要正确的语法以避免 MISRA 14-6-1 警告.具有依赖基类的类模板
- 用于从一个基派生的类的GDB漂亮的打印机
- 类设计:类成员继承自同一基类
- 基模板化类中的 Statiс 变量,C++17 用法
- 选择专用于派生实例的基类的类模板
- 使用模板基类消除工厂类派生类冗余的干净方法
- C++:使用重载而不是动态强制转换通过基选择派生类
- 如何使用多态性将相同的操作应用于具有相同基类的不同对象的unordered_sets
- 具有虚拟析构函数的基类子类中的默认析构函数
- 仅授予对具有相同基类的类的函数访问权限
- 防止公众使用用作私人基类的类
- 如何使继承相同基类的类的虚拟方法弄清楚如何处理它们的参数?
- 从基指针C++派生类的类型