今天写C++primer 5th中文版第422页的程序时,出现了”不允许使用不完整的类型“的错误,下面我就用类A 与 类B 作为代表,重现一下该错误,并且提出解决方案。

一、带问题的类设计A:

1、类A放在A.h 与 A.cpp中

2、由于B需要访问A的私有成员,故声明B是其友元类

3、A中需要利用自身作为参数去创建一个新的B类实例。

代码如下:A.cpp中就是一个空的析构函数的实现。。。没什么,我把主要实现都写在了A.h中

 #pragma once
#include<iostream> class B; // 声明B 从而能够在下文声明为友元类
class A
{
public:
friend class B; // 声明B为友元类
A(int a) :data(a){} B Pirnt() // 打印一行文字并且调用B的构造函数:B(A &a, int secParam = 5)创建一个B的实例
{
std::cout << "hehe " << std::endl;
return B(*this);
}
~A();
private:
int data;
};

二、带问题的类设计B

1、B 接受一个A 引用参数,达成构造B的目的

同样的,B.cpp中也是一个空的构造函数与一个空的析构函数,下面展示的是B.h中的代码:

 #pragma once
#include "A.h"
class B
{
public:
B(A &a, int secParam = ) :data(a.data){}
B();
~B(); private:
int data;
};

三、问题提示:

在A.h的第11 与 14行使用B的地方提示”B不是完整的数据类型“

四、分析

首先,我们需要在类A中将B声明为友元类,此时类B尚未定义,故仅在class A前面声明了class B;然后在此利用B进行代码编写,但是带来了问题:

这种声明叫做 前向声明,它在声明之后,定义之前的这段时间,它都是不完整的,对于类A中的代码来讲,他们不知道B什么时候定义,所以编译器直接认为B是不完整的。。。

如果分别在A.h与B.h中包含对方的头文件,又造成了循环包含。

五、解决方案。

1、将A  B写在一个头文件中

2、声明A,定义B

3、定义A

代码:

A.h

#pragma once
#include<iostream>
class A; // 声明A class B
{
public:
B(A &a, int secParam = ); // 只可声明,不能在此处定义,具体定义在B.cpp中写
~B(); private:
int data;
}; class A
{
public:
friend class B; // 声明B为友元类
A(int a) :data(a){} B Pirnt() // 打印一行文字并且调用B的构造函数:B(A &a, int secParam = 5)创建一个B的实例
{
std::cout << "hehe " << std::endl;
return B(*this);
}
~A();
private:
int data;
};

B.cpp

#include "A.h"
B::B(A &a, int secParam) :data(a.data)
{
} B::~B()
{
}

对于A.cpp,还是空的构造函数与析构函数

原因:

1、上文说道在类声明与定义之间的时间内,其是不完整的,不可使用的,但是  可以定义指向这种类型的指针和引用,可以声明(不能定义)以不完整类型作为参数或者返回类型的函数。

故,可以先在B中的构造函数里使用 A& 这个参数.

不过使用A&作为参数的那个构造函数的实现(定义)需要在cpp中写,因此执行到CPP的时候,A已经是完整的了。

2、 执行到A时,B的各成员声明已经完整。

C++不完整的类型的更多相关文章

  1. 如何在C++中获得完整的类型名称(RTTI的typeid在不同平台下有不同的输出值表达,自建类改进了RTTI丢失的信息)

    Wrote by mutouyun. (http://darkc.at/cxx-get-the-name-of-the-given-type/)   地球人都知道C++里有一个typeid操作符可以用 ...

  2. 怎样在C++中获得完整的类型名称

    Wrote by mutouyun. (http://darkc.at/cxx-get-the-name-of-the-given-type/) 地球人都知道C++里有一个typeid操作符能够用来获 ...

  3. VS2013 :IntelliSense: 不允许使用不完整的类型

    出现上述情况,一般是存在对应的头文件,但是没有引用造成的. 引用的时候要注意头文件的顺序, 本项目中的头文件一般先引入,也就是用双引号#include "xxx.h",然后是系统中 ...

  4. C语言的不完整类型和前置声明(转)

    声明与定义(Declaration and Definition) 开始这篇文章之前,我们先弄懂变量的declaration和definition的区别,即变量的声明和定义的区别. 一般情况下,我们这 ...

  5. C#中类型分析中的常见问题 Type - 转

    http://www.cnblogs.com/yuanyuan/archive/2012/08/16/2642281.html 写代码的时候经常需要分析已有类型的信息例如:分析现有类型自动生成类, 或 ...

  6. sizeof(extern类型数组)

    error:  #70: incomplete type is not allowed 用sizeof计算数组大小,编译器提示不允许使用不完整的类型.在keil上编译直接报错,拿到vs2010上编译可 ...

  7. C#实现完整的防盗自制监控系统

    在您的手机中通知您家中的入侵者,并拍摄他们的照片 介绍 在本文中,我将展示一些DIY东西​​,用于安装监控系统,检测家中的入侵者,拍摄照片并通过手机通知您,必要时可以打电话给警察并提供照片以便快速识别 ...

  8. Spring IOC(七)类型推断

    Spring IOC(七)类型推断 Spring 系列目录(https://www.cnblogs.com/binarylei/p/10198698.html) Spring 容器中可以根据 bean ...

  9. Android源码大放送之material design类型

    本文转载自:http://www.apkbus.com/android-243232-1-1.html 鉴于大家对源码的渴望,就算自己辛苦一点也要满足大家的需求,查看了几百个源码之后终于筛选出了这些精 ...

随机推荐

  1. 关于WebView的内存泄露问题

    在一个Activity中包含着一个WebView,通过WebView不停的访问Web页面,会发现内存会一直增长,退出此Activity,甚至杀死此Activity,内存依然没有被释放.这就导致,即使是 ...

  2. systemstate dump 介绍

    systemstate dump 介绍 By Janezhang-Oracle on 十二月 13, 2012 当数据库出现严重的性能问题或者hang了的时候,我们非常需要通过systemstate ...

  3. 【转】交叉编译faac共享库

    转自:http://blog.csdn.net/cjj198561/article/details/38382889 编译准备 1.代码下载 在mac下面执行:wget http://download ...

  4. MapReduce从输入文件到Mapper处理之间的过程

    1.MapReduce代码入口 FileInputFormat.setInputPaths(job, new Path(input)); //设置MapReduce输入格式 job.waitForCo ...

  5. 业务gis 怎么让别的开发人员不需要懂gis就可以搞开发? (五)

    我们稍微搭建了一个比较简单的图形使用模板,flex端操作这里我就不说了,按大家喜好写,最后javascript部分可以通过jsduck工具生成一个开发文档给业务开发人员,前提注释部分要写好,要公开的注 ...

  6. 【转】最实用的IT类网站及工具大集合

    转自:http://www.cnblogs.com/annie00/p/5753507.html 1.聚合数据 大家在开发过程中,可能会用到各种各样的数据,想找一些接口来提供一些数据.比如天气预报查询 ...

  7. linux中django+apache配置

    配置apahce通过mod_wsgi访问django代码,最终通过版本说明: Apache/2.0.63 (Unix) DAV/2 mod_wsgi/3.5 Python/2.6.6 下面讲述一波三折 ...

  8. 学习练习 java练习小题题目:判断一个整数能被几个9整除

    题目:判断一个整数能被几个9整除 package com.hanqi.lianxi; import java.io.*; public class Test1 { //判断能否被9整除 static ...

  9. [drp 8]get和post的区别,以及乱码问题的解决

    导读:不管是之前做.NET还是现在做Java的项目,都有涉及到get和post请求,第一次遇到的时候,应该是在人事系统的时候,那时候说要总结,结果一直没有总结.现在,做一个初步的总结,连着总结一下提交 ...

  10. [转]回答--python django学的很迷茫怎么办?

    作者:王一链接:http://www.zhihu.com/question/26235428/answer/36568428来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处 ...