开发者社区> 问答> 正文

c++ class 构造函数内调用自己的成员函数,对自己的成员变量赋值,却无效 - C++报错

"

新人发帖,有问题欢迎指正.


有这么个问题,google半天无果.
文字描述是这样的:有一个class,在它的构造函数内部,调用了它自己的一个成员函数,这个成员函数内部,对它的一个成员变量进行赋值.但是发现在release版(-o2)中成员变量并没有被赋值.debug版(-od)是赋值成功的.


环境:VC2005, C++语言.


下面是代码:
// b.h
class B : public A
{
public:
    B(uint32 type);
    virtual ~B();
    void setVersion(uint8 version) { mVersionFlags = ((mVersionFlags&0x00FFFFFF)|(((uint32)version)<<24)); }
    void setFlags(uint32 flags) { mVersionFlags = ((mVersionFlags&0xFF000000)|(flags&0x00FFFFFF)); }
    // other member functions here
protected:
    uint32 mVersionFlags;
};


// b.cpp
B::B(uint32 type)
    : A(type)
{
    setVersion(0); // 这里调用了自己的成员函数,对mVersionFlags进行初始化
    setFlags(0);
}


// c.h
class C : public B
{
public:
    C(): B(TYPE) { printf("vf: %x\n", mVersionFlags); } // 这里将父类B的成员变量打印出来,输出为非零值,而且每次运行的结果都不一样
    enum
    {
        TYPE = FOURCC('c','c','c','c')
    };
    // other member functions and varibles here
};


问题:如上所示,在class C的构造函数里打印,发现B的成员变量没有被初始化.这个问题仅出现于release版(-o2优化),debug版(-od)不出现.


做过一些尝试,有些办法可以解决,有些不行.
这些办法都可以:

// 办法1:
// b.cpp
B::B(uint32 type)
    : A(type)
    , mVersionFlags(0) // 办法1: 放在初始化列表里
{
}

// 办法2:
// b.cpp
B::B(uint32 type)
    : A(type)
{
    setVersion(0);
    setFlags(0);
    printf("vf1: %x\n", mVersionFlags); // 办法2: 使用一下mVersionFlags. 这样好像编译器就不会优化掉了
}

// 办法3:
// b.cpp
B::B(uint32 type)
    : A(type)
{
    // 办法3: 直接将之前两个成员函数的函数体替换到这里,也能解决问题
    { mVersionFlags = ((mVersionFlags&0x00FFFFFF)|(((uint32)version)<<24)); }
    { mVersionFlags = ((mVersionFlags&0xFF000000)|(flags&0x00FFFFFF)); }
}

// 办法4:
// b.h
class B : public A
{
public:
    B(uint32 type);
    virtual ~B();
    void setVersion(uint8 version) { mVersionFlags = ((mVersionFlags&0x00FFFFFF)|(((uint32)version)<<24)); }
    void setFlags(uint32 flags) { mVersionFlags = ((mVersionFlags&0xFF000000)|(flags&0x00FFFFFF)); }
    // other member functions here
protected:
    volatile uint32 mVersionFlags; // 办法4: 增加volatile标记
};


最终我使用了办法4.但是现在的问题是我还是不清楚为什么.哪位大侠能给个提示.


"

展开
收起
montos 2020-05-31 21:37:58 1899 0
1 条回答
写回答
取消 提交回答
  • "关注!######

    构造函数里面没有对mVersionFlags 初始化。


    ######在debug下mVersionFlags的初始值是0,但在release下却不是这样######FOURCC是干什么的?我把FOURCC那个TYPE改成=0之后,用-O2和-g都是可以正确出结果的。。(为了防止初始值是0,我在B的构造函数里面还把 setVersion(0); setFlags(0);的参数改成了1,也没问题。。)
    compiled by g++ (GCC) 4.8.1 20130725 (prerelease)######

    我现在也遇到了同样的问题,不知老兄你是怎么解决的,万望指教

    "
    2020-05-31 21:38:10
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
使用C++11开发PHP7扩展 立即下载
GPON Class C++ SFP O;T Transce 立即下载
GPON Class C++ SFP OLT Transce 立即下载