【问题标题】:Address of a static variable when instance created创建实例时静态变量的地址
【发布时间】:2016-05-05 22:03:34
【问题描述】:

我有一个 c++ 类,上面有静态常量和静态变量。 在启动期间,我用一些字符串值初始化所有静态常量变量,用零初始化所有静态变量。

然后我创建该类的第一个实例并尝试单独修改静态变量。 然后我创建了同一类的第二个实例,并尝试写一些其他值,而不是为第一个实例编写的值。

后来,当我尝试访问第一个实例的静态变量时,它保存了第二个实例的值。在查看内存位置时,我发现两个实例的变量指针地址相同。

是不是我写错了?

我的代码sn-p:

#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

【问题讨论】:

  • 你知道什么是静态成员吗​​?这就是他们应该如何工作

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


【解决方案1】:

是不是我写错了?

不,这正是静态数据成员的工作方式。每个都有一个实例。

【讨论】:

  • 好的,我知道我不能将静态用于这种功能。但是如何实现这样一个可能是同一结构的一部分的羽毛呢?有什么解决方法吗??
  • @kar 我不知道您要实现什么样的功能。我刚刚回答了你似乎在问的问题。
猜你喜欢
  • 2020-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-07
  • 1970-01-01
  • 2019-03-28
  • 2014-02-03
  • 2015-10-25
相关资源
最近更新 更多