实例创建时的静态变量的地址

时间:2016-05-05 22:03:34

标签: c++ static-members derived-class

我有一个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

1 个答案:

答案 0 :(得分:1)

  

这是我写错了吗?

不,这正是静态数据成员的工作方式。每个可以获得一个实例。