类变量将在基类之后初始化

CCh*_*ste 3 c++ class initializer-list

我希望有一个简单的问题,我无法找到有关初始化“变量”的具体答案。这是有问题的初始化列表:Triangle.cc

Triangle::Triangle(Vector _a, Vector _b, Vector s, Point o)
    : a(_a), b(_b), Shape(o, new RectilinearAnimationStrategy(s, bBoxMaxX(), bBoxMinX(), bBoxMaxY(), bBoxMinY())){}
Run Code Online (Sandbox Code Playgroud)

我知道你必须按照类中定义的顺序初始化变量,但是当你初始化一个对象时,这种情况又如何呢?我需要ab在调用之前显式初始化Shape,以便将正确的值返回给RectilinearAnimationStrategy. 我尝试的一切都给了我

Triangle.h:在构造函数中Triangle::Triangle(Vector, Vector, Vector, Point)
Triangle.h:11:警告:Triangle::b将在
Triangle.cc:9之后初始化:警告:基础Shape
Triangle.cc:9:警告:在这里初始化时

非常感谢任何帮助,谢谢。

当前设置和给出的第一个答案都没有得到该错误,但输出没有考虑ab考虑(在调用 Shape 构造函数时未初始化)

and*_*net 5

我知道 Shape 的初始化依赖于函数 bBoxMaxX(),它依赖于成员 b 的初始化。由于基类 Shape 在成员 b 之前初始化,因此代码将无法正常工作。

解决方案是让 bBoxMaxX() 函数使用初始化变量 _b。或者直接使用 _b 的 Shape 初始值设定项。例如:

Triangle::Triangle(Vector _a, Vector _b, Vector s, Point o) : Shape(o, new RectilinearAnimationStrategy(s, bBoxMaxX(_b), bBoxMinX(_b), bBoxMaxY(_b), bBoxMinY(_b))),  a(_a), b(_b) {}
Run Code Online (Sandbox Code Playgroud)