`
chriszeng87
  • 浏览: 738966 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

C++中类的声明

    博客分类:
  • C++
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++中类声明和成员函数的分离写法是一种常见的编程实践,它有助于提高代码的可读性和可维护性。通过`student.cpp`和`student.h`这两个文件,我们可以看到这种模式的实际应用,以及它是如何在具体类如`...

    c++ 类的声明和定义

    在类的声明中,可以使用成员访问限定符(member access specifier)来指定成员的访问权限。私有的成员(private)只能在类内部访问,而公用的成员(public)可以被外界访问。受保护的成员(protected)不能被类外...

    C++类变量声明

    4. **初始化**:C++允许在类声明中直接初始化成员变量,Java则需要在构造函数中或使用`final`关键字实现。 5. **内存管理**:C++提供了更多的内存控制,如手动分配和释放内存(使用`new`和`delete`),而Java通过...

    C++函数声明和定义

    C++编程语言中,函数声明和定义是两个关键的概念,它们在程序的编译和链接过程中扮演着不同的角色。理解这两个概念对于编写大型、模块化的C++程序至关重要。 首先,函数声明(Function Declaration)主要是告诉...

    C#调用C++DLL导出类

    在这个例子中,`MyClass_MyFunction_Create()`和`MyClass_MyFunction_Destroy()`是C++DLL中创建和销毁类实例的函数,需要在C#中对应的DllImport声明。`MyClass_MyFunction()`是类方法的C风格接口。 为了更好地管理...

    C语言调用C++类中的方法

    有时,我们可能需要在C语言项目中调用C++编写的类和方法,这种情况在跨语言交互或维护既有C代码库时尤为常见。本教程将详细讲解如何实现这一目标。 首先,为了使C语言能够调用C++的方法,我们需要确保C++类具备...

    C++ 包含类两个类互相调用彼此的类成员变量和方法

    总结,C++中类之间的相互调用是一种强大的设计手段,但需要谨慎处理循环包含和封装性问题。通过前置声明、智能指针和朋友函数,我们可以有效地解决这些问题,实现类之间的有效协作。在实际项目中,应尽量减少这种...

    c++嵌套类详细分析

    C++中的嵌套类是指在一个类中定义的类,定义嵌套类的目的是隐藏类名,减少全局的标识符,从而限制用户能否使用该类建立对象。这样可以提高类的抽象能力,并且强调了两个类(外围类和嵌套类)之间的主从关系。 嵌套...

    从C++导出类到Python

    这意味着我们需要将类的方法声明为`extern "C"`,以避免C++的名称修饰(name mangling)。此外,这些方法应该接受并返回Python兼容的数据类型,例如`int`、`double`和`char*`。 ```cpp extern "C" { PyObject* ...

    c++ 类的互相调用的方法

    在C++编程中,类的互相调用是一个...总结起来,C++中类的互相调用是一种强大的工具,但也需要谨慎使用。理解并熟练运用成员函数调用和友元函数,以及遵循良好的面向对象设计原则,可以帮助我们构建高效、可扩展的代码。

    c++ 中类外部定义函数

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

    dlopen加载c++ 函数及类 文档

    dlopen 加载 C++ 函数及类文档 dlopen 加载 C++ 函数及类...dlopen 加载 C++ 函数及类文档需要注意 name mangling 问题,并使用 extern "C" 限定符声明函数和类,同时加载类时需要注意成员函数的 name mangling 问题。

    C#调用C++类中的方法

    - 在C#代码中,使用`DllImport`特性声明对C++ DLL的引用。这告诉.NET框架该方法是在外部DLL中定义的,需要在运行时加载并调用。 - 示例: ```csharp [DllImport("你的dll文件名.dll", CallingConvention = ...

    C++类继承内存布局详解图(一目了然)

    "C++类继承内存布局详解图" C++类继承内存布局是一种复杂的机制,涉及到类的继承、成员变量的访问、成员函数的访问、虚函数调用、强制转换到基类或虚基类等多个方面。在本文中,我们将从C结构的布局开始,逐步介绍...

    Java调用c++类对象

    下面我们将深入探讨如何通过JNI在Java中调用C++类对象以及涉及的关键知识点。 首先,我们需要理解JNI的概念。JNI是Java平台的一部分,提供了一套接口,让Java代码可以与本地代码进行通信。这包括加载动态链接库、...

    C++多项式运算类

    在这个项目中,我们关注的是一个特定的C++实现——"多项式运算类"。这个类的设计和实现旨在简化对数学多项式进行操作,例如加法、减法、乘法等。它利用了C++的数据结构概念以及一种内存管理技巧——引用计数。 首先...

    jni java类与c++类映射的例子

    在JNI中,Java类通常被映射为C++中的结构体或类,Java方法则被映射为C++的函数。这样,我们可以在Java代码中调用C++的方法,反之亦然。 1. **设置开发环境**: 在开始之前,确保你的开发环境已经配置了Java JDK和...

    xml c++解析类

    综上所述,"xml c++解析类"提供了C++环境中解析XML的工具,结合STL的优势,使得在C++程序中处理XML数据变得简单和高效。通过`MarkupSTL`和`XmlDoc`这两个类,开发者可以方便地读取、操作和创建XML文档,从而实现更...

    将现有的C++类转换成dll动态链接库

    例如,可以在类中添加一个`Instance()`函数,并在类头文件中声明这个函数,同时添加宏定义`#define InitFile(CInitFile::Instance())`。这样就可以通过宏`InitFile`来访问类的实例。 - 步骤5:将类的成员函数封装成...

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

    C++中虚析构函数的作用是为了确保当使用基类的指针删除派生类的对象时,派生类的析构函数被正确调用。这种机制可以防止内存泄漏和其他潜在的问题。 在C++中,析构函数是用来释放对象占用的资源的。通常情况下,析构...

Global site tag (gtag.js) - Google Analytics