zoukankan      html  css  js  c++  java
  • 互引头文件的一种解决策略

    在C++中经常会涉及到处于不同头文件的类互相引用的情况,有时候头文件引用(include)会搞得很乱,导致报一堆的错。其实遵循一定规则,可以避免大部分的混乱。

    首先,要对头文件进行处理,保证不会出现重定义的错误。这个应该每个人都会,通常有两种做法:

    1. 在.cpp文件中添加保护,比如在.cpp文件中添加:

    #ifndef _XX_H_
    #define _XX_H_
    #include "xx.h"
    #endif

    2. 在.h中添加保护,比如在xx.h文件中添加:

    #ifndef _XX_H_
    #define _XX_H_
    // 头文件声明内容
    #endif

    _XX_H_是我比较习惯的命名方式,其他的命名方式,比如__XX__H__,XX_H等等,只要足够Unique就好。建议使用第二种方式进行重定义的保护,一劳永逸而且具有通用性,任何人拿来就能用,不需要考虑保护问题。当然,如果在VS(03以上吧?)下,最好的解决方案是用#pragma once,更为简单有效。

    其次,最好将所有头文件需要用到的自定义类(或函数)都在定义前声明一下,比如在xx.h的类xx中需要用到yy.h中的yy类,那么最好做以下的处理:

    class yy;

    class xx
    {
    // 实现内容
    };

    这样就可以保证头文件引用的次序不会对结果造成影响。

    通常,保证以上两点,通常涉及到类互指的问题都可以解决。当然如果天生就有设计问题,无论如何都是没有办法的,比如:

    // xx.h
    class xx
    {
    yy t;
    };

    // yy.h
    class yy
    {
    xx t;
    };

    不难看出,这是个递归定义,编译器无法确定类xx和yy的大小,就无法通过编译。一种解决策略是采用指针,比如:

    // xx.h
    class xx
    {
    yy* t;
    };

    // yy.h
    class yy
    {
    xx* t;
    };

    当然,具体情况具体分析,提取一个更高层的类等手段都可以考虑。

  • 相关阅读:
    VBS发送邮件-1
    docker命令
    NLP | 自然语言处理
    windows: Python安装scipy,scikit-image时提示"no lapack/blas resources found"的解决方法
    Sense2vec with spaCy and Gensim
    python 去停用词
    nohup command > myout.file 2>&1 &
    NLTK vs SKLearn vs Gensim vs TextBlob vs spaCy
    Gensim进阶教程:训练word2vec与doc2vec模型
    Gensim入门教程
  • 原文地址:https://www.cnblogs.com/dongzhiquan/p/2289529.html
Copyright © 2011-2022 走看看