2016-05-05 8 views
-3

静的なconstと静的変数を持つC++クラスがあります。 起動時に、すべての静的const変数をいくつかの文字列値で初期化し、すべての静的変数をゼロで初期化します。インスタンスが作成されたときの静的変数のアドレス

次に、そのクラスの1番目のインスタンスを作成し、静的変数だけを変更しようとしました。 その後、私は同じクラスの2番目のインスタンスを作成し、1番目のインスタンスに書き込んだ以外の値を書き込もうとしました。

後で、第1インスタンスの静的変数にアクセスしようとすると、第2インスタンスの値が保持されます。私は可変ポインタのアドレスを見つけたメモリの場所を見ながら、両方のインスタンスのための同じです。

私が間違って書いたものですか?

マイコードスニペット:

#include "stdafx.h" 
#include <time.h> 
#include <stdlib.h> 

CBase::CBase(const myStruct *myStructPtr) { 
    initStruct(myStructPtr); 
} 

CBase::~CBase() {} 

void CBase::initStruct(const myStruct *myStructPtr) { 
    m_myStructPtr = const_cast<myStruct *>(myStructPtr); 
    if (m_myStructPtr) { 
     uint8_t nNumDatas = (m_myStructPtr->numOfOutputs) ? (m_myStructPtr->numOfOutputs - 1) : 0; 
     if (nNumDatas) { 
      for (int idx = 0; idx < m_myStructPtr->numOfOutputs - 1; idx++) { 
       if (m_myStructPtr->someNumber[idx]) 
        m_myStructPtr->someNumber[idx] = (unsigned int)rand(); 
      } 
     } 
    } 
} 

void CBase::printSomeNumber() { 

if (m_myStructPtr) { 
    uint8_t nNumDatas = (m_myStructPtr->numOfOutputs) ? (m_myStructPtr->numOfOutputs - 1) : 0; 
    if (nNumDatas) { 
     for (int idx = 0; idx < m_myStructPtr->numOfOutputs - 1; idx++) { 
      printf("\n printing : name %s, print number : 0x%x", m_myStructPtr->someName[idx],m_myStructPtr->someNumber[idx]); 
     } 
    } 
} 
} 

const char * CDerived::scm_acsomeName[] = { "INIT", "REQ", NULL }; 
unsigned int CDerived::sm_aunsomeNumber[] = { 0, 0xDEADBEEF }; 

const myStruct CDerived::myDerivedStruct = { 
    3, scm_acsomeName, sm_aunsomeNumber 
}; 

int main() 
{ 
    CBase *FirstDerived = new CDerived(); 
    CBase *SecondDerived = new CDerived(); 

FirstDerived->printSomeNumber(); 
SecondDerived->printSomeNumber(); 
while (1); 
return 0; 
} 

私のヘッダファイル:

#include <stdint.h> 
#include <string> 
#include <iostream> 

struct myStruct { 
    uint8_t numOfOutputs; 
    const char **someName; 
    unsigned int *someNumber; 
}; 

class CBase 
{ 
public: 
    CBase(const myStruct *myStructPtr); 
    virtual ~CBase(); 
    void printSomeNumber(); 
private: 
    CBase(const CBase&); 
    void initStruct(const myStruct *myStructPtr); 

protected: 
    const myStruct* m_myStructPtr; 
}; 

class CDerived : public CBase { 
private: 
    static const myStruct myDerivedStruct; 
    static const char *scm_acsomeName[]; 
    static unsigned int sm_aunsomeNumber[]; 

public: 
    CDerived() : CBase(&myDerivedStruct) {} 
    virtual ~CDerived() {} 
}; 

コンソール印刷メッセージ:それは私が間違って書いた何か

printing : name INIT, print number : 0x0 
printing : name REQ, print number : 0x4823 
printing : name INIT, print number : 0x0 
printing : name REQ, print number : 0x4823 
+0

静的メンバーは何ですか?それだけで動作するはずです – user463035818

答えて

1

ですか?

いいえ、これは静的データメンバーの仕組みです。 クラス1つのインスタンスを取得します。

+0

私はこの種の機能に静的を使用できないことを理解しました。しかし、どのように同じ構造の一部であるかもしれないそのような羽根を実装するには?任意の回避策?? – kar

+0

@kar実装しようとしている機能の種類はわかりません。私はちょうどあなたが求めているような質問に答えました。 – juanchopanza

関連する問題