`
qimo601
  • 浏览: 3416503 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

C++中类的声明

阅读更多

 

可以声明一个类而不定义它
        class Screen;//declaration of the Screen class
        这个声明,有时候被称为前向声明(forward declaration),在程序中引入了类类型的Screen.在声明之后,定义之前,类Screen是一个不完全类型(incompete type),即已知Screen是一个类型,但不知道包含哪些成员.
       不完全类型只能以有限方式使用,不能定义该类型的对象,不完全类型只能用于定义指向该类型的指针及引用,或者用于声明(而不是定义)使用该类型作为形参类型或返回类型的函数.

 

 

对于C++中,类的定义之前声明它,如下实例代码:

class B;

class A{

//..............................

B * ptr_B;.

};

class B{

//....................

};

被提前声明的类在其定义之前,只能使用该类的指针或者引用 。

在类的定义结束(编译器在遇到类定义的右花括号之后),用该类来声明类实例对象,或对象指针,引用都是合法的。

 

 

 

前向声明

超前引用
               
        所谓超前引用是指一个类型在定义之前就被用来定义变量和声明函数。
       一般情况下,C/C++要求所有的类型必须在使用前被定义,但是在一些特殊情况下,这种要求无法满足,例如,在类CMyView中保留了一个非模式对话框对象指针,该对象用于显示/修改一些信息。为了实现对话框应用按钮,把对话框做的修改立刻更新到view界面上,为此,需要在对话框类中需要保存view类的指针,这样定义关系就变成如下的代码:    
   

   #ifndef __MYVIEW_H__
    #define __MYVIEW_H__
    //这是view类的头函数
    #include "MyDialog.h"
    class CMyView::public CView
    {
    protected:
        CMyDialog * pDlg;
        //这里是其他定义
    };
    #endif
    
    #ifndef __MYDIALOG_H__
    #define __MYDIALOG_H__
    //这是对话框类的定义
    #include "MyView.h"
    class CMyDialog::public CDialog
    {
        protected:
            CMyView * pView;
            //其他定义
    };
    #endif
 
          从编译器角度看,编译MyDialog.CPP时,系统首先定义宏__MYDIALOG_H__,然后包含MyView.hMyView.h#include "MyDialog.h"由于__MYDIALOG_H__已经定义,所以不再起作用。在CMyView类的声明中, CMyDialog* pDlg ;就会让编译器产生“CMyDialog"类型没有定义之类的错误,编译MyView.CPP文件出现的错误可以类似得到。    
         更一般的情况,类A和类B需要彼此互相引用,这样必然有一个类会先被定义,而另外一个类后被定义,这样在先被定义的类引用后被定义的类的时候,就导致了所谓的超前引用。
    超前引用导致的错误有以下几种处理办法:
    1) 使用类声明
    在超前引用一个类之前,首先用一个特殊的语句说明该标识符是一个类名,即将被超前引用。其使用方法是:
            a)  class ClassB;声明即将超前引用的类名
            b)  定义class ClassA
            c)  定义class ClassB;
            d)  编制两个类的实现代码。
    上述方法适用于所有代码在同一个文件中,一般情况下,ClassAClassB分别有自己的头文件和cpp文件,这种方法需要演变成:
            a) 分别定义ClassAClassB,并在cpp文件中实现之
            b) 在两个头文件的开头分别用class ClassB;class ClassA;声明对方
            c) 在两个cpp文件中分别包含另外一个类的头文件
     NOTE:这种方法切记不可使用类名来定义变量和函数的变量参数,只可用来定义引用或者指针。
     
     2) 使用全局变量
         由于全局变量可以避免超前引用,不用赘述。我的习惯是,把类对象的extern语句加在该类头文件的最后,大家喜欢怎样写那都没有什么大问题,关键是保证不要在头文件中胡乱包含。
    3) 使用基类指针。
        这种方法是在引用超前引用类的地方一律用基类指针。而一般情况下,两个互相引用的类并不涉及其基类,因此不会造成超前引用。以开始的例子说:在CMyDialog类中用CView*代替CMyView*CMyView类中用CDialog*代替CMyDialog*,这样必然不会造成超前引用。

    说明:本文中,为了叙述方便,把class AClass;语句成为类AClass的声明,把class AClass开始的对AClass的类成员变量、成员函数原型等的说明称为类的定义,而把在CPP中的部分称为类的定义。如果大家对这三个词有不同的理解,请按照自己的本意把这三个词换成相应的词来理解。 

转:http://blog.csdn.net/abc78400123/article/details/7599466

分享到:
评论

相关推荐

    C++类变量声明

    C++类变量声明,验证与java类声明不同的Demo

    C++中类使用全局变量

    在C++中,声明一个类,并且定义一个全局变量,练习全局变量的使用。注意全局变量的使用技巧和方法。

    c++ 类的声明和定义

    c++类的声明和定义是在学习c++中开始会遇到的问题,希望有所帮助!

    C++函数声明和定义

    C++函数声明和定义 声明是告诉编译器一些信息,以协助编译器进行语法分析,避免编译器报错。...那都是因为C++同意将程序拆成几段分别书写在不同文件中以及上面提到的编译器只从上朝下编译且对每个文件仅编译一次。

    C++_关于声明,定义,类的定义,头文件作用

    C++_关于声明,定义,类的定义,头文件作用

    c++类声明和成员函数分离写法

    c++将类成员函数实现与类的声明分离的写法,实现了学生类的分离写法

    c++ 中类外部定义函数

    c++ 基础 类外定义函数 调用函数 基础

    C++中的string类

    之所以抛弃char*的字符串而选用C++标准程序库中的string类,是因为他和前者比较起来,不必 担心内存是否足够、字符串长度等等,而且作为一个类出现,他集成的操作函数足以完成我们大多数情况下(甚至是100%)的需要。...

    如何理解C和C++的复杂的声明

    如何理解C和C++的复杂的声明如何理解C和C++的复杂的声明如何理解C和C++的复杂的声明如何理解C和C++的复杂的声明如何理解C和C++的复杂的声明如何理解C和C++的复杂的声明如何理解C和C++的复杂的声明如何理解C和C++的...

    c++万年历类的声明添加额外功能

    c++万年历,类的声明与实现,输入年份打印整年年历,额外添加生肖功能,查询当前时间,引入文件流,可以将整年年历打印至Word文档。

    教你理解负责的C++声明

    本文将由易到难,一步一步教会你如何理解这种复杂的C/C++声明:我们将从每天都能碰到的较简单的声明入手,然后逐步加入const修饰符和typedef,还有函数指针,最后介绍一个能够让你准确地理解任何C/C++声明的“右左...

    详解C++ 前置声明

    前置声明是C/C++开发中比较常用的技巧,主要用在三种情形: 变量/常量,例如extern int var1;; 函数,例如void foo();,注意类的成员函数无法单独做前置声明; 类,例如class Foo;,也可以前置声明模板类:...

    浅析C++中前置声明的应用与陷阱

    以下是对C++中前置声明的应用与陷阱进行了详细的分析介绍,需要的朋友参考下

    友元类(C++基础教学)

    如何声明和创建友元类 简单友元类的声明,C++中友元类的应用范围

    C++给出一个哺乳动物类,要求从此派生出一个狗类

    C++中类与继承的知识,给出一个哺乳动物类,要求从此派生出一个狗类狗属哺乳动物,且它的属性有品种之分(在哺乳类基础上增加品种数据成员),叫声区别于其他动物(即Speak()实现为虚函数,输出“Woof!”),还会摇...

    C#调用C/C++DLL收取中文字符处理

    或wchar_t*来表示,char*表示的是ANSCII字符串, wchar_t*表示Unicode字符串,Unicode字符串在C/C++中一个字符占用两个字节,ANSII字符串一个字符占用一个字节(中文占用两个字节), 如果C++的接口声明为char*的入口...

    如何理解C和C++复杂类型声明

    曾经碰到过让你迷惑不解、类似于 int * (* (*fp1) (int) ) [10];这样的 变量声明吗? 本文将由易到难,一步一步教会你如何理解这种复杂的 C/C++声明。 pdf 高清晰

    C++类和对象练习 实现日期类

    为了更好的理解`C++`类和对象的知识,我们可以动手实现一下`C++`的一个简单的日期类,完成相应的函数,更好的帮助我们理解类和对象. 从日期类的构造函数,拷贝构造,获取当月天数,日期与天数...Date.h是日期类中方法的声明.

    如何理解c和c++的复杂类型声明

    如何理解c和c++的复杂类型声明

    C++中虚析构函数的作用

    我们知道,用C++开发的时候,用来做基类的类的析构函数一般都是虚函数。可是,为什么要这样做呢?下面用一个小例子来说明:

Global site tag (gtag.js) - Google Analytics