我写了如下述的一个程序:
class cls_A
{
   unsigned int m_Val;
}class cls_B
{
  cls_A m_ClsA;
}class cls_C
{
  cls_B m_ClsB;
}
    .
    .
    .
cls_C * t_pC = NULL;
cls_C * t_clsC;
unsigned int t_CurVal;((t_clsC.m_ClsB).m_ClsA ).m_Val = 1;
t_pC = &(t_clsC);t_CurVal = 0;
t_CurVal = (((t_pC->m_ClsB).m_ClsA).m_Val);
我单步跟踪到最后的赋值语句,查看(((t_pC->m_ClsB).m_ClsA).m_Val)的值,显示出为1,而执行完最后的赋值语句后查看t_CurVal的值发觉不为1,而成了0x100···0(1后若干个0)。但此时(((t_pC->m_ClsB).m_ClsA).m_Val)的值任为1.这是为什么?我该怎样改?(注:我用的是vc6,会不会是版本太老的缘故)

解决方案 »

  1.   

    cls_C * t_clsC = new cls_C;
      

  2.   

    t_pC 和 t_clsC 都没new?
      

  3.   

    cls_C * t_clsC; 
    ===又笔误了。
      

  4.   

    看得我眼花,我觉得直接用abc我看的更清爽点……
      

  5.   

    cls_C * t_clsC; 
    改为
    cls_C t_clsC; 
      

  6.   

    不好意思敲错了,t_clsC变量的说明是,cls_C t_clsC;
      

  7.   

    class cls_A 

    public:
    unsigned int m_Val; 
    } ;class cls_B 

    public:
    cls_A m_ClsA; 
    } ;class cls_C 

    public:
    cls_B m_ClsB; 
    } ;
    int _tmain(int argc, _TCHAR* argv[])
    {
    cls_C * t_pC = NULL; 
    cls_C t_clsC; 
    unsigned int t_CurVal;  ((t_clsC.m_ClsB).m_ClsA ).m_Val = 1; 
    t_pC = &(t_clsC);  t_CurVal = 0; 
    t_CurVal = (((t_pC->m_ClsB).m_ClsA).m_Val);    
    cout<<t_CurVal<<endl;
    return 0;
    }08下没问题
      

  8.   

    #include <iostream>
    using namespace std;
    class cls_A
    {
    public:
    unsigned int m_Val;
    } ;class cls_B
    {
    public:
    cls_A m_ClsA;
    } ;class cls_C
    {
    public:
    cls_B m_ClsB;
    } ;
    int main(int argc, char* argv[])
    {
    cls_C * t_pC = NULL;
    cls_C t_clsC;
    unsigned int t_CurVal;

    ((t_clsC.m_ClsB).m_ClsA ).m_Val = 1;
    t_pC = &(t_clsC);

    t_CurVal = 0;
    t_CurVal = (((t_pC->m_ClsB).m_ClsA).m_Val);   
    cout <<t_CurVal <<endl;
    return 0;}vc6.0 sp6 下ok。。输出为1。单步跟踪调试也是1
      

  9.   

    建议初学者 看看 windows 核心编程 这本书, 有助于 提高 综合能力 。主要是了解内部原理阿 。如果你看到程序语言 能想到 语言的汇编层 实现, 你就厉害了。
      

  10.   

    注:我用的是vc6,会不会是版本太老的缘故)[color=#FF0000][/color]
    搞程序最怕这样的态度,遇到问题先说是别人的问题
      

  11.   


    #include "stdafx.h"
    #include <iostream>using namespace std;class cls_A 
    {
    public:
    unsigned int m_Val; 
    };class cls_B 
    {
    public:
    cls_A m_ClsA; 
    };class cls_C 
    {
    public:
    cls_B m_ClsB; 
    };int _tmain(int argc, _TCHAR* argv[])
    {
    cls_C* t_pC = NULL;
    cls_C t_clsC;
    unsigned int t_CurVal;  t_clsC.m_ClsB.m_ClsA.m_Val = 1;
    t_pC = &(t_clsC);  t_CurVal = 0; 
    t_CurVal = t_pC->m_ClsB.m_ClsA.m_Val; system("pause"); return 0;
    }
    05下没有任何问题!除了楼主几个笔误之外单步跟踪t_CurVal值为1!
      

  12.   

    vc6不会有问题,我用了很多年,很多时候调试不出错误原因时都以为是vc6有错误,最终发现还是我的错。就算vc6有bug,应该也不至于很严重,至少对我这样的业余编程人员不会有太大影响。朋友,你的代码既然都在单步调试了,应该不会有语法错误,你直接粘贴过来就行了,没有必要又去重新打一遍,你发帖在点确认前最好再检查一遍。
    我记得我自学的c++教材,最先讲到代码风格的问题,你去看看mfc的代码风格,变量命名方法,如何对齐括号。我的做法:class ClassA;ClassA* pA = NULL;unsinged int iCurVal;
    c++的成员变量一般以m_开头,m_p开头是个指针,m_i是个整数。g开头作为全局变量。