2016-05-05 3 views
-3

У меня есть класс C++, на котором есть статическая константа и статическая переменная. Во время запуска я инициализирую все статические константные переменные с некоторыми строковыми значениями и всеми статическими переменными с нулями.Адрес статической переменной при создании экземпляра

Затем я создаю 1-й экземпляр этого класса и попытался изменить статическую переменную в одиночку. Затем я создаю второй экземпляр того же класса и попытался написать другое значение, отличное от того, что я написал для первого экземпляра.

Позже, когда я попытался получить доступ к статической переменной 1-го экземпляра, он удерживает значения второго экземпляра. при поиске в ячейке памяти я нашел адрес указателя переменной одинаковым для обоих экземпляров.

Это что-то, что я написал неправильно?

Моего фрагмент кода:

#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

Это то, что я написал неправильно?

Нет, это точно, как работают статические члены данных. Вы получаете один экземпляр за класс.

+0

Хорошо, я понял, что я не могу использовать статический для этой функции. Но как реализовать такое перо, которое может быть частью одной и той же структуры? любое обходное решение ?? – kar

+0

@kar Я понятия не имею, какие функции вы пытаетесь реализовать. Я просто ответил на вопрос, который вы, казалось, спрашивали. – juanchopanza

Смежные вопросы