zoukankan      html  css  js  c++  java
  • C++类定义,.h文件与.cpp文件之间的关系以及条件编译

    大家有没有考虑过,我们问什么要将一个类定义和类实现分开呢?
    本周的Windows编程课,老师演示了一个例子,完美地讲解了这个问题,在我看来是解答了我一直以来的疑问,下面把我的一些体会整理在下面。

    • 使整个大的程序或者说项目显得逻辑清晰、分明
    • 最重要的,也是老师在这堂课上展示出来的,就是在出现类组合这种情况,也就是类里面的数据成员使用了其他类的对象的时候,如果不采用这种形式,就需要考虑很多哪个类放在前面这一类的问题,非常麻烦。

    老师上课讲的例子是这样的:

    #include <iostream>
    using namespace std;
    
    class A
    {
    private:
        B b;
    public:
        void doSomething();
    };
    
    void A::doSomething()
    { b.doSomething(); }
    
    
    class B
    {
    public:
        void doSomething();
    };
    
    void B::doSomething()
    { cout<<"OK"<<endl; }
    
    int main(int argc, char *argv[])
    {
        A * a = new A;
        a->doSomething();
        return 0;
    }
    

    上面的程序是否能通过编译呢?答案当然是否定的。原因就在于A里使用了B类的对象,又由于A类定义在前面,编译器会不知道B究竟是什么,自然也无法B b.
    解决方法当然可以将类B定义在前面,也可以在类A定义前面加一句class B;的前置声明。但如果类变得更多,这样就非常麻烦了。
    另外,将类A中的B b改为B * b也可通过编译,原因在于,B b的时候编译器需要知道B究竟是什么,只有这样才能给它分配空间。而B * b的话,编译器知道这是一个指针就足够了,因为指针类型保存一个地址,大小显然是已知的。
    因此,将类定义和类实现分开就显得非常重要了。

      Windows编程课上,老师仔细讲了.h和.cpp文件。在将类定义和类实现分开的时候,遇到的问题可真不少。
      其中一个问题就是,A、B两个类,A的数据成员有B的对象,在a.cpp里我们要包含b.h,在mian里我们要包含a.h和b.h,这时Qt Creator会报错,提醒你出现了问题

    E:My_filesMy_studyComputer_Science_2017-2018-2windows programming180516094934289_4thClassCode4thClassCodeconvertAandBtoHeader.h:4: error: redefinition of ‘class B’
    class B
    ^

      显示B被重复定义了。我们当然可以在main里不写#include “ b.h”,因为我们可以分析出这个已经在a.cpp里出现,在#include “a.h”时会自己带上。但是当类一多我们就记不清了,这时候就需要借助宏使用条件编译。

    #ifndef B_H
    #define B_H
    内容
    #endif //B_H

      那么作用是什么呢?上面B_H可以任意的起名字,只是一个符号,表示这个符号如果还没有被宏定义的话,就定义它。这样,当b.h已经被include过以后,B_H相当于已经被宏定义过了,之后再被include,内容就不会再执行了,也就解决了问题。
    C++的条件编译还有其他的形式,具体用法为:
    形式一:
    #if 常量表达式
    程序段
    #endif
    当常量表达式非零时编译程序段
    形式二:
    #ifndef 常量表达式
    程序段1
    #else
    程序段2
    #endif
    当常量表达式为非零时编译程序段1,否则编译程序段2
    形式三:
    #if 常量表达式1
    程序段1
    #elif 常量表达式2
    程序段2
    ……
    ……
    #elif 常量表达式n
    程序段n
    #else
    程序段n+1
    #endif
    形式四:也就是最上面讲的条件编译

    参考文献:郑莉等.C++语言程序设计[M].4版.北京:清华大学出版社,2010.
    欢迎访问我的网站——Luke的技术小站:http://119.23.31.14

  • 相关阅读:
    POJ 1328 Radar Installation
    POJ 1700 Crossing River
    POJ 1700 Crossing River
    poj 3253 Fence Repair (贪心,优先队列)
    poj 3253 Fence Repair (贪心,优先队列)
    poj 3069 Saruman's Army(贪心)
    poj 3069 Saruman's Army(贪心)
    Redis 笔记与总结2 String 类型和 Hash 类型
    数据分析方法有哪些_数据分析方法
    数据分析方法有哪些_数据分析方法
  • 原文地址:https://www.cnblogs.com/wlglucky/p/12458762.html
Copyright © 2011-2022 走看看