外部添加的类和SDI程序View类之间的相互访问

常见类似错误:

1<i:\try\ctry\ctry\ctryview.h(18) : error C2143: 语法错误 : 缺少“;”(在“*”的前面)
1<i:\try\ctry\ctry\ctryview.h(18) : error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
1<i:\try\ctry\ctry\ctryview.h(18) : error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
1<i:\try\ctry\ctry\ctryview.h(18) : warning C4183: “GetDocument”: 缺少返回类型;假定为返回“int”的成员函

 

任务:新建SDI工程,添加Snake类。添加菜单,该菜单调用Snake类的中一个函数,该函数不断改变Snake中成员变量值,并调用View中OnDraw函数进行绘制结果。

 


----------------------------------Snake.h------------------------------

#pragma once

class CSnake
{
  public:
       int  total ;
       void  set (int  a );
       void  startshow ();
  public:
       CSnake(void);
       ~CSnake(void);
};

----------------------------------Snake.cpp----------------------------
#include "StdAfx.h"
#include "Snake.h"
#include "MainFrm.h"
#include "SDIDoc.h"                          //方法1:加上这句可以解决那个错误问题
#include "SDI01View.h"

void CSnake:: set (int  times )
{
total = times ;
}

void CSnake:: startshow ()
{
CMainFrame *pFrame=(CMainFrame*)( AfxGetApp ()-> GetMainWnd ());
CSDI01View *pView =(CSDI01View*)(pFrame-> GetActiveView ());
for (int  i = total ; i >0; i --)
{
pView-> setmember (i);
Sleep (500);
}
}

----------------------------------SDI01View.h----------------------------

#pragma once //#include "Snake.h" 不要随便在h文件里include,如果只是定义指针,可以用class CSnake申明为不完全类型,然
class CSnake; 后再cpp文件里include“Snake.h",对snake指针进行操作

class CSDI01Doc ;                                  //方法2:也可以解决那个错误问题,原理一样
 
class CSDI01View : public CView
{
    public:
        void setmember(int k);
        int num;
        CSnake *snake;
    public:
        CSDI01Doc* GetDocument() const;
}

----------------------------------SDI01View.cpp----------------------------

#include "stdafx.h"
#include "SDI01.h"
#include "SDI01Doc.h"
#include "SDI01View.h"
 #include "Snake.h"

CSDI01View::CSDI01View():num(0)
{
    snake=new CSnake;
}

void CSDI01View::OnDraw(CDC* pDC)
{
    CString str;     str.Format("%d",num);
    pDC->TextOut(200,100,str);
}
void CSDI01View::setmember(int k)
{
    num=k;
    CDC*pDC1=GetDC();
    OnDraw(pDC1);
}

void CSDI01View::OnMenuStart() // 入口:CSDI01View 菜单消息处理程序
{
    snake->set(20);
    snake->startshow();
}

 
  也可以将外部类定义为一个全部变量,这样更方便一些。

 

                      // 注意到View.cpp,Doc.cpp中都包含了SDI01.h
----------------------------------SDI01.h----------------------------
class  CSDI01App  : public CWinApp
{
};
extern CSDI01App  theApp;

class   CSnake ;            //为了不要随便在h文件里include别的文件,可以声明。因为,下面也只是声明外部变量。
extern CSnake  theSnake;

----------------------------------SDI01.cpp----------------------------
#include "Snake.h"

CSDI01App theApp;
CSnake theSnake;    //像theApp一样,可供外部任意有包含SDI01.h文件的文件使用

CSDI01App::CSDI01App() { ... }

...

    

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值