MFC如何定义全局类对象

kongsoda 2018-04-22 11:06:45
我想在基于对话框的MFC程序中创建一个全局类对象
我#include "quee.h"里面定义了一个类CQuee
然后在按钮的函数void CTESTDDlg::OnButtonStart() 中定义一个CQuee<int> qu(6000);
现在我想在onpaint()里调用这个qu怎么办啊。希望大神支支招。
我按照网上我搜到的方法试了一下,

好像不能用于类对象的定义
...全文
1470 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
kongsoda 2018-04-28
  • 打赏
  • 举报
回复
谢谢各位大神,问题已经解决!
赵4老师 2018-04-24
  • 打赏
  • 举报
回复
请那些喜欢将数组作为函数参数传来传去或作为函数返回值的码农思考一下为什么不把整个互联网内容当作函数参数传来传去或作为函数返回值呢?
schlafenhamster 2018-04-23
  • 打赏
  • 举报
回复
队列 是 FIFO (FirstIn FirstOut) ,堆栈 是 LIFO (LastIn FirstOut)通常的 操作 是 Push Pop ! 你的 // write bool push(const DATA& data) // read bool pop(DATA& data) 函数名 不好 ! 另外 inline bool IsEmpty() {return m_head == m_tail;}
worldy 2018-04-23
  • 打赏
  • 举报
回复
引用 4 楼 weixin_41859051 的回复:
[quote=引用 2 楼 worldy 的回复:] CTestAPP的构造函数里,你又定一个类CTestAPP? LZ先把类的概念和操作方法搞清楚
我只是在原来的CTestAPP里加了几行。。改成int qu;就不会报错[/quote] 添加几行,如果是你自己写的代码: class CTestAPP:public CWinApp { 原来的CTestAPP定义内容 添加的几行 } 如果CTestAPP是已经封装好的,你可以从CTestAPP派生一个新类 class CNewTestApp: public CTestAPP { 添加的几行 ,注意,派生就不需要重复定义原来的内容 }
sichuanwww 2018-04-23
  • 打赏
  • 举报
回复
我都习惯写一个PublicMember类,里面全放静态成员,相当于全局变量,想在哪里用就在哪里用,一切爽歪歪!!
schlafenhamster 2018-04-23
  • 打赏
  • 举报
回复
如果 用 int buffer[MAXSIZE]; //存储内存分配基地址 int rdIndex=0; //队列头索引 int wtIndex=0; //队列尾索引 代码, 直接 放 CxxxApp.cpp 文件 头部, 不是 类里! 使用时 用 extern 即: extern int buffer[ ]; //存储内存分配基地址 extern int rdIndex; //队列头索引 extern int wtIndex; //队列尾索引 extern int WriteQueue(int *buffer, int e) ; extern int ReadQueue(int *buffer, int *e);
schlafenhamster 2018-04-23
  • 打赏
  • 举报
回复
e 就是 一个 形参 ,相当于 你的 DATA
kongsoda 2018-04-23
  • 打赏
  • 举报
回复
引用 6 楼 schlafenhamster 的回复:
是不是 把问题 复杂化 了:

/////////////////////////////////////////////////// 
// 留了一个 空位置,判断 是否满或空 
//circular Queue 循环队列实现  
#include "stdafx.h"
#include <stdlib.h>  

#define MAXSIZE 100  
  
int buffer[MAXSIZE]; //存储内存分配基地址  
int rdIndex=0;       //队列头索引  
int wtIndex=0;       //队列尾索引  

// wtIndex 入队列操作  
int WriteQueue(int *buffer, int e)  
{  
    if ((wtIndex + 1) % MAXSIZE == rdIndex)
	{
		return 1; //队列已满时,不执行入队操作
	}
//将元素放入队列尾部 
    buffer[wtIndex] = e; 
 //尾部元素指向下一个空间位置,取模运算保证了索引不越界(余数一定小于除数)  
	wtIndex = (wtIndex + 1) % MAXSIZE;
	return 0;// ok
}  
  
// rdIndex 出队列操作  
int ReadQueue(int *buffer, int *e)  
{  
    if (rdIndex == wtIndex)
	{
		return 1;  //空队列,直接返回
	}
//头部元素出队 
    *e = buffer[rdIndex];             
    rdIndex = (rdIndex + 1) % MAXSIZE; 
	return 0;// ok
} 
//测试用
int main()
{
	int e;
	for(int i=0; i< 60;i++)
	{
		if(WriteQueue(buffer, i))
		{
			printf("Queue is full!\r\n");
			break;
		}
	}
// 
	for(int k=0; k< 30;k++)
	{
		if(ReadQueue(buffer, &e))
		{
			printf("Queue is empty!\r\n");
			break;
		}
		printf("%d,",e);
	}
// more 60=60=120 %100 = 20
	for(int ii=0; ii< 60;ii++)
	{
		if(WriteQueue(buffer, i))
		{
			printf("Queue is full!\r\n");
			break;
		}
	}
//
	printf("\r\n");
	printf("wtIndex %d\r\n",wtIndex);// =20
	printf("rdIndex %d\r\n",rdIndex);// =30
// 队列长度为rear-front + QueueSize,因此通用的计算队列长度公式为:
	int len=(wtIndex - rdIndex + MAXSIZE) % MAXSIZE;//120-30=90
	printf("len= %d\r\n",len);
// return=exit
	getchar();
	return 0;
}
请问这个程序里面,e、e*是什么意思 如果应用于MFC中,测试前面的内容应该放在什么地方,我怎么用这个循环队列?
kongsoda 2018-04-23
  • 打赏
  • 举报
回复
引用 11 楼 zhao4zhong1 的回复:
https://www.baidu.com/s?wd=MFC如何定义全局类对象
如果百度可以解决,我早就解决了,这个关键字我搜过,没法解决
kongsoda 2018-04-22
  • 打赏
  • 举报
回复
引用 2 楼 worldy 的回复:
CTestAPP的构造函数里,你又定一个类CTestAPP? LZ先把类的概念和操作方法搞清楚
我只是在原来的CTestAPP里加了几行。。改成int qu;就不会报错
kongsoda 2018-04-22
  • 打赏
  • 举报
回复
引用 1 楼 schlafenhamster 的回复:
放 app.cpp 文件里, 但不要放 app类 里, 就是 全局变量, 使用的地方 写 extern 即 C 风格的 全局变量 ,与类无关 !
我想实现一个循环队列,您的意思是我直接在app.cpp里定义一个类是吗? 这是我的quee.h文件,不知道有没有问题?
template<typename DATA> class CQuee { public: CQuee(int count = 10) { pArray = new DATA[count]; m_Count = count; m_head = m_tail = 0; }; ~CQuee(){ delete[]pArray; pArray = 0; }; public: bool pop(DATA&data) { if (isempty()) return false; data = pArray[m_head]; m_head = ++m_head%m_Count; return true; }; bool push(const DATA&data) { if (isfull()) return false; pArray[m_tail] = data; m_tail = ++m_tail%m_Count; return true; }; bool isempty() { return m_head == m_tail; }; bool isfull() { return (m_tail + 1) % m_Count == m_head; }; int size() { return (m_tail - m_head + m_Count) % m_Count; }; private: DATA*pArray; int m_Count; int m_head; int m_tail; };
worldy 2018-04-22
  • 打赏
  • 举报
回复
CTestAPP的构造函数里,你又定一个类CTestAPP? LZ先把类的概念和操作方法搞清楚
schlafenhamster 2018-04-22
  • 打赏
  • 举报
回复
放 app.cpp 文件里, 但不要放 app类 里, 就是 全局变量, 使用的地方 写 extern 即 C 风格的 全局变量 ,与类无关 !
schlafenhamster 2018-04-22
  • 打赏
  • 举报
回复
你那个 qu(6000) ,得到的 错误 是 C2059, 表示不能 这样使用 ,要使用 指针 即 CQuee *pQu; init是 pQu=new CQuee(6000); exit时 if(pQu->pArray) delete [] pQu->pArray; if(pQu) delete pQu;
schlafenhamster 2018-04-22
  • 打赏
  • 举报
回复
是不是 把问题 复杂化 了:

/////////////////////////////////////////////////// 
// 留了一个 空位置,判断 是否满或空 
//circular Queue 循环队列实现  
#include "stdafx.h"
#include <stdlib.h>  

#define MAXSIZE 100  
  
int buffer[MAXSIZE]; //存储内存分配基地址  
int rdIndex=0;       //队列头索引  
int wtIndex=0;       //队列尾索引  

// wtIndex 入队列操作  
int WriteQueue(int *buffer, int e)  
{  
    if ((wtIndex + 1) % MAXSIZE == rdIndex)
	{
		return 1; //队列已满时,不执行入队操作
	}
//将元素放入队列尾部 
    buffer[wtIndex] = e; 
 //尾部元素指向下一个空间位置,取模运算保证了索引不越界(余数一定小于除数)  
	wtIndex = (wtIndex + 1) % MAXSIZE;
	return 0;// ok
}  
  
// rdIndex 出队列操作  
int ReadQueue(int *buffer, int *e)  
{  
    if (rdIndex == wtIndex)
	{
		return 1;  //空队列,直接返回
	}
//头部元素出队 
    *e = buffer[rdIndex];             
    rdIndex = (rdIndex + 1) % MAXSIZE; 
	return 0;// ok
} 
//测试用
int main()
{
	int e;
	for(int i=0; i< 60;i++)
	{
		if(WriteQueue(buffer, i))
		{
			printf("Queue is full!\r\n");
			break;
		}
	}
// 
	for(int k=0; k< 30;k++)
	{
		if(ReadQueue(buffer, &e))
		{
			printf("Queue is empty!\r\n");
			break;
		}
		printf("%d,",e);
	}
// more 60=60=120 %100 = 20
	for(int ii=0; ii< 60;ii++)
	{
		if(WriteQueue(buffer, i))
		{
			printf("Queue is full!\r\n");
			break;
		}
	}
//
	printf("\r\n");
	printf("wtIndex %d\r\n",wtIndex);// =20
	printf("rdIndex %d\r\n",rdIndex);// =30
// 队列长度为rear-front + QueueSize,因此通用的计算队列长度公式为:
	int len=(wtIndex - rdIndex + MAXSIZE) % MAXSIZE;//120-30=90
	printf("len= %d\r\n",len);
// return=exit
	getchar();
	return 0;
}
schlafenhamster 2018-04-22
  • 打赏
  • 举报
回复
如果 想放 app 类 里, 取得 时候 可以 1 extern CxxxApp theApp; 2 AfxGetApp()->

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧