做项目时,因为要获取一个类A的数据,就定义了该类的一个全局变量,然后通过这个全局变量在类C去调用类A的成员函数,开始发现pop处理的数据一直为零导致后面没有输出。找了半天发现在另外一个类B的中定义了类A的对象指针,然后数据都是通过类A的对象指针返回的。刚开始不理解,通过类的对象去访问数据没有问题啊,后来才明白类的不同实例之间没有关系啊,数据不是共享的。《C ++ Primer》一书中P375也对这次有详尽描述,“每个对象都具有自己类数据成员的副本。修改item的数据成员不会改变任何其他Sales_item对象的数据成员。”
有三个类
class COjectA
{
public:
COjectA(void);
~COjectA(void);
TYPE InPut(); 插入数据到m_DataList</span>
bool PopData(TYPE &type); //
vector<TYPE> m_DataList;
};
class COjectB
{
public:
COjectB();
~COjectB();
static void * CheckData(void *param);
COjectA* m_pCOjectA; //实例化一个对象
};
void * COjectB::CheckData( void *param )
{
if (m_pCOjectA != NULL)
{
TYPE type = m_pCOjectA->InPut();
}
}
在COjectB中定义了COjectA的一个对象调用Input函数。然后想在COjectC中获取到mDataList的值,就在“COjectA.h”和“COjectA.cpp”中定义了全局变量声明和定义,有一个线程调用PopData这个函数,发现数据为零。
class COjectC
{
public:
static void * DoDealData(void *param);
};
void * COjectC::DoDealData( void *param )
{
if (g_COjectA.PopData()) //error
{
}
}
这些都基础,却花了一段时间去找错不应该。
解决办法:1. 将COjectB中的
COjectA* m_pCOjectA;
也改为全局调用,
g_COjectA.Input()
2. 在COjectC中写一个函数传递一个COjectA对象的指针类型。