我有一个c ++类,它上面有静态const和静态变量。 在启动期间,我使用一些字符串值初始化所有静态const变量,并使用零初始化所有静态变量。
然后我创建该类的第一个实例并尝试单独修改静态变量。 然后我创建同一个类的第二个实例,并尝试写一些其他值,而不是我为第一个实例写的。
稍后,当我尝试访问第一个实例的静态变量时,它会保存第二个实例值。在查看内存位置时,我发现两个实例的变量指针地址相同。
这是我写错了吗?
我的代码段:
#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 :(得分:1)
这是我写错了吗?
不,这正是静态数据成员的工作方式。每个类可以获得一个实例。