静的な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
静的メンバーは何ですか?それだけで動作するはずです – user463035818