1

我正在将一个项目从 MSVC2010 交叉编译到 GCC 4.7。我在每个地方调用基类构造函数,如下所示:

 FPSCamera::FPSCamera(CameraType camType, float fov, int viewportW, int viewportH, float nearPlane, float farPlane)
{
    Camera3D::Camera3D( camType,  fov,  viewportW,  viewportH,  nearPlane,  farPlane);

}

我进入 GCC :

不能直接调用构造函数

MSVC 不会抱怨……这样就可以修复错误:

FPSCamera::FPSCamera(CameraType camType, float fov, int viewportW, int viewportH, float nearPlane, float farPlane)

       :Camera3D( camType,  fov,  viewportW,  viewportH,  nearPlane,  farPlane);

{

}

为什么?

4

2 回答 2

8

这是VC++ 2010 中的一个错误- 构造函数是无名的特殊成员函数,不能直接调用。在这种情况下,首先调用基类的默认构造函数,然后调用基类 的参数化构造函数。您可能没有注意到 this 有任何问题的原因是this对基本构造函数的两次调用之间的指针不同。似乎正在构建两个单独的对象,但只有一个正在被销毁。根据基类获取的资源,可能存在一些您还不知道的泄漏或错误。

下面的示例显示了施工期间发生的情况。

#include <iostream>

class Base
{
public:
    Base()
    {
        std::cout << "Base default ctor. this = " << this << std::endl;
    }
    Base(int)
    {
        std::cout << "Base parameterized ctor. this = " << this << std::endl;
    }
};

class Derived : public Base
{
public:
    Derived()
    {
        std::cout << "Inside derived ctor." << std::endl;
        Base::Base(1);
        std::cout << "Leaving derived ctor" << std::endl;
    }
};



int main()
{
    Derived();
    return 0;
}

结果:

基本默认 ctor。this = 00000000002FF6F0
内部派生ctor。
基本参数化ctor。this = 00000000002FF6B0
留下派生的ctor

[注意:微软没有计划在短期内解决这个问题]

于 2013-05-19T09:44:49.933 回答
1

发布作为答案而不是评论......

不知道为什么 MSVC 没有抱怨,但您必须在派生类构造函数的初始化程序列表中初始化基类。

这样做的原因是,当你在类构造函数的主体中时,包括基类已经被构造,所以从函数体调用基构造函数没有意义。

我的猜测是 MSVC 只是将其视为普通函数调用?它不能构造基类,因为它已经构造好了,所以我认为它把它当作一个“正常”的函数调用。所以,虽然它没有构造基类,但它可能会产生一些初始化的效果......

另请参阅调用超类构造函数的规则是什么?

于 2013-05-19T09:44:42.337 回答