搜索
bottom↓
回复: 11

求指导,关于MFC中两个类定义了相同名称的类变量

[复制链接]

出0入0汤圆

发表于 2013-12-22 16:57:24 | 显示全部楼层 |阅读模式
本帖最后由 AUTORs哈 于 2013-12-22 20:14 编辑

MFC中两个类A,B定义了相同名称的类C变量,没有用extern和static,为什么感觉它们是一个变量,
因为在A对象中改变C对象的成员变量, 在B对象的C对象的成员变量也是同样的变化。
不理解,求解释,这两个类中的C变量不应该是两个变量吗?
A就是ThreadData,B就是Threaddraw,C是DDC1G(加粗显示部分),
代码如下:
threaddata.h头文件如下,A就是ThreadData

#ifndef ThreadData_H_
#define ThreadData_H_

#include "workerthread.h"
#include <iostream>
#include <fstream>

//using namespace std;
class ThreadData:public CWorkerThread
{
public:       
        ThreadData();
        ~ThreadData();
       
        DDC1G *        ddc1g;
private:
        bool reset;
        void resetpage();
        int rampage,pagenum,pagesize;
};
#endif

。。。。。。分割线。。。。。。。。。。。。。。

threaddraw.h头文件如下,B就是Threaddraw

#ifndef ThreadDraw_H_
#define ThreadDraw_H_


#include "ddc.h"
#include "workerthread.h"
#include <math.h>

class ThreadDraw:public CWorkerThread
{
public:       
        ThreadDraw();
        ~ThreadDraw();

        DDC1G *        ddc1g;
        ...
private:         
        int drawpage,pagenum,pagesize;
        UINT spectdata[270000];
        UINT spectdata2[270000];
        ...
       
};
#endif

。。。。。。分割线。。。。。。。。。。。。。。
DDC1G.h代码如下,C是DDC1G
class DDC1G:public DDC
{

public:
        int readpage;
        UINT spectdata[130000]
        ...
}
。。。。。。分割线。。。。。。。。。。。。。。
在threaddata.cpp中用到ddc1g的主要是以下语句
memcpy( ddc1g->spectdata+(ddc1g->readpage)*pagesize,ddc1g->pUIBar2+(ddc1g->readpage)*pagesize,pagesize*4);
在threaddraw.cpp中用到ddc1g的主要是以下语句
  memcpy(spectdata,ddc1g->spectdata,65544*4);

问题是,在threaddata.cpp中改变了ddc1g->spectdata的值,threaddraw.cpp中的spectdata读到了相同的数据

阿莫论坛20周年了!感谢大家的支持与爱护!!

你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。

出0入0汤圆

发表于 2013-12-22 17:34:17 | 显示全部楼层
你描述的现象基本不会存在,不是幻觉吧。

出0入0汤圆

发表于 2013-12-22 17:48:04 来自手机 | 显示全部楼层
如果c是函数,或是包含方法的类,并且这个方法中使用了全局或静态变量,你说的这个现象是有可能的。否则有可能是内存越界了。

出0入0汤圆

 楼主| 发表于 2013-12-22 18:06:40 | 显示全部楼层
javenreal 发表于 2013-12-22 17:48
如果c是函数,或是包含方法的类,并且这个方法中使用了全局或静态变量,你说的这个现象是有可能的。否则有 ...

C是一个类

出0入0汤圆

发表于 2013-12-22 18:15:09 | 显示全部楼层
那就肯定是幻觉了,不如把代码发出来看?

出0入0汤圆

 楼主| 发表于 2013-12-22 20:50:15 | 显示全部楼层
farmerzhangdl 发表于 2013-12-22 18:15
那就肯定是幻觉了,不如把代码发出来看?

已发。。

出0入50汤圆

发表于 2013-12-22 21:01:12 | 显示全部楼层
你的这两个类中的指针变量 ddc1g是怎么赋值的
如果都是 ddc1g= new DDC1G;这么给的话会出现你说的问题的话那真的是见鬼了。
如果两个类中的ddc1g都指向同一个地方的话,那你说的问题就是没问题。

出0入0汤圆

发表于 2013-12-22 21:05:04 来自手机 | 显示全部楼层
你的DDCG1只是一个指针,就相当于一个门牌号码。如果他们的地址相同,改了一个另一个当然会变了。

出0入0汤圆

发表于 2013-12-22 21:06:24 来自手机 | 显示全部楼层
注:是他们所指向的地址,而不是它们本身的地址。它们本身的地址是绝对不会一样的。

出0入0汤圆

发表于 2013-12-22 21:10:53 | 显示全部楼层
你这明明两个指针指到了同一个位置,改变其中一个数据肯定另外一个类里的数据也变了啊,因为他们根本就是同一个数据。
PS:建议还是重新学习下C++的基础,如果基础不牢固就去搞MFC和线程的话,欲哭无泪。。

出0入0汤圆

 楼主| 发表于 2013-12-22 21:26:17 | 显示全部楼层
javenreal 发表于 2013-12-22 21:06
注:是他们所指向的地址,而不是它们本身的地址。它们本身的地址是绝对不会一样的。 ...

原因找到了,在另一个对象中,
ddc1g = new DDC1G();
threaddata->ddc1g = ddc1g;
threaddraw->ddc1g = ddc1g;
将它们两个所指向的地址变为一样了,谢谢各位了

出0入0汤圆

 楼主| 发表于 2013-12-22 21:27:42 | 显示全部楼层
代码不是我写的,看别人的代码也是很繁琐的一件事
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-10-3 02:38

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表