-2

私はこれを得る:

画像

これは、2 つのクラスのサンプル コードです。

main.h

class CControl
{
protected:
    int m_X;
    int m_Y;

public:
    void SetX( int X ) { m_X = X; }
    void SetY( int Y ) { m_Y = Y; }

    int GetX() { return m_X; }
    int GetY() { return m_Y; }

    CControl *m_ChildControls;
    CControl *m_NextSibling;
    CControl *m_PreviousSibling;
    CControl *m_Parent;
    CControl *m_FocusControl;
};

class CButton : public CControl
{
protected:
    bool m_Type;
    bool m_Selected;
    bool m_Focused;
public:
    CButton( bool Type );
    ~CButton();
};


CButton::CButton( bool Type )
{
}

これは 2 つのクラスの宣言にすぎません (完全ではありませんが、完全にコード化されたバージョンでも問題が発生します)。

main.cpp

#include <windows.h>
#include "main.h"

int main()
{
    CButton *g_Button;
    g_Button = new CButton( 1 );

    return 0;
}

これは、デバッグ分析を行うための新しい CButton オブジェクトとして g_Button を宣言するアプリケーションのメイン関数です。

4

3 に答える 3

3

CControl *メンバーのことですか?コンストラクターでそれらを初期化しなかったので、それらが何らかの「ランダムな」値であることは正常です。特に、表示される値は、初期化されていないメモリをマークするために VC++ のデバッグ ビルドで使用されるパターンです。

同じことがクラスの他のフィールドにも当てはまります (-842150451 は の 32 ビット符号付き整数の解釈です0xcdcdcdcd)。

于 2012-09-17T13:26:18.633 に答える
2

ポインターは初期化されていないため、何でもかまいません。

コンパイラによって生成されたデフォルト コンストラクターは、CControlPOD メンバーを初期化しません。自分で書く必要があります:

CControl() : m_ChildControls(NULL),  m_NextSibling(NULL), m_PreviousSibling(NULL)
             m_Parent(NULL), m_FocusControl(NULL)
{
}
于 2012-09-17T13:25:24.560 に答える
1

コンストラクターでクラスのデータ メンバーを初期化する必要があります。

CButton::CButton( bool Type )
{
    m_Type = Type;
    m_X = m_Y = 0;
    m_ChildControls = NULL;
    // ...
} 
于 2012-09-17T13:25:12.757 に答える