第一卷  第五章 5.3友元

下面的代码是《c++编程思想》里面的代码,

struct X;
struct Y{
void f(X*);
}; struct X{
private:
int i;
public:
void initialize();
friend void Y::f(X*);
}; void X::initialize(){
i=0;
} int main(){
X x;
x.initialize();
Y y;
y.f(&x); }

  

struct X;是一个不完全类型说明,(不完整类型是这样一种类型,它缺乏足够的信息例如长度去描述一个完整的对象。

《c++编程思想》里面的原话:struct Y有一个成员函数f(),它将修改X类型的对象。这里有一个难题,因为c++编译器要求在引用任一变量之前必须先声明,所以struct Y必须在它的的成员Y::f(X*)被声明为struct X的一个友元之前声明,但要声明Y::f(X*),又必须先声明Struct X.

  解决的办法:注意到Y::f(X*)引用了一个X对象的地址,这一点很关键,因为编译器知道如何传递一个地址,这一地址具有固定的大小,而不管被传递的是什么对象,即使它还没有完全知道对象类型大小。然而,如果试图传递整个对象,编译器就必须知道X的全部定义以确定它的大小以及如何传递,这就使得程序员无法去声明一个类似于Y::g(x)的函数。

上面的斜体字是书中的原话,红色字体是我想存在疑问的地方,于是写如下代码

#include<iostream>
using namespace std;
struct X;
struct Y{
void f(X*);
void g(X);
}; struct X{
private:
int i;
public:
void initialize();
friend void Y::f(X*);
friend void Y::g(X);
}; void X::initialize(){
i=0;
}
void Y::f(X* x){
x->i=10;
} void Y::g(X x){
cout<<x.i<<endl;
}
int main(){
X x;
x.initialize();
Y y;
y.f(&x);
y.g(x); }

  上面的代码,在Struct Y这个结构体中加入了一个成员函数,g(X),传递的参数就是struct X的整个对象,并非指针,我们也只是在Y::g(X)之前做了一个不完全类型说明,编译仍然是可以通过,并可以运行的,上面的代码和红色字体所说的相违背

c++编程思想里面的错误(可能c++标准变了,所以以前的东西没有更新)的更多相关文章

  1. [Java编程思想-学习笔记]第3章 操作符

    3.1  更简单的打印语句 学习编程语言的通许遇到的第一个程序无非打印"Hello, world"了,然而在Java中要写成 System.out.println("He ...

  2. Java编程思想重点笔记(Java开发必看)

    Java编程思想重点笔记(Java开发必看)   Java编程思想,Java学习必读经典,不管是初学者还是大牛都值得一读,这里总结书中的重点知识,这些知识不仅经常出现在各大知名公司的笔试面试过程中,而 ...

  3. 16条Web2.0法则的编程思想

    1.在你开始之前,先定一个简单的目标.无论你是一个Web 2.0应用的创建者还是用户,请清晰的构思你的目标.就像“我需要保存一个书签”或者“我准 备帮助人们创建可编辑的.共享的页面”这样的目标,让你保 ...

  4. 注解的基本盘点 -- 《Java编程思想》

    注解(元数据)为我们在代码中添加信息提供了一种形式化的方法,使我们可以在之后的某一个时刻非常方便地使用这些数据. ---<Java编程思想> 其实注解可以理解为一个工具类,只要使用了这个工 ...

  5. java编程思想第四版中net.mindview.util包下载,及源码简单导入使用

    在java编程思想第四版中需要使用net.mindview.util包,大家可以直接到http://www.mindviewinc.com/TIJ4/CodeInstructions.html 去下载 ...

  6. C++编程思想重点笔记(下)

    上篇请看:C++编程思想重点笔记(上) 宏的好处与坏处 宏的好处:#与##的使用 三个有用的特征:字符串定义.字符串串联和标志粘贴. 字符串定义的完成是用#指示,它容许设一个标识符并把它转化为字符串, ...

  7. java编程思想

    Java编程思想,Java学习必读经典,不管是初学者还是大牛都值得一读,这里总结书中的重点知识,这些知识不仅经常出现在各大知名公司的笔试面试过程中,而且在大型项目开发中也是常用的知识,既有简单的概念理 ...

  8. Java编程思想(11~17)

    [注:此博客旨在从<Java编程思想>这本书的目录结构上来检验自己的Java基础知识,只为笔记之用] 第十一章 持有对象 11.1 泛型和类型安全的容器>eg: List<St ...

  9. Java编程思想 (1~10)

    [注:此博客旨在从<Java编程思想>这本书的目录结构上来检验自己的Java基础知识,只为笔记之用] 第一章 对象导论 1.万物皆对象2.程序就是对象的集合3.每个对象都是由其它对象所构成 ...

随机推荐

  1. sqlserver导入导出数据库结构及创建用户分配权限

    1.创建用户分配权限 https://www.cnblogs.com/jennyjiang-00/p/5803140.html 2.sqlserver2008导出表结构和表数据 导出表结构   htt ...

  2. 62. 用流程自带的打印功能,IE浏览器打印出来是空白

    用流程自带的打印功能,IE浏览器打印出来是空白的这个问题确认是由于IE启用了兼容模式导致的了把IE的兼容模式关掉就行了

  3. 2.登录linun 输入密码登录不进去 进入单用户模式 修改 然后reboot

    centos进入单用户模式 单用户模式,就是你现在站在这台机器面前能干的活,再通俗点就是你能够接触到这个物理设备. 一般干这个活的话,基本上是系统出现严重故障或者其他的root密码忘记等等,单用户模式 ...

  4. 不丢失log的情况下迁移git空间

    背景: 原来的源码都放在个人的空间下,为了团队后续规范管理,建立了一个团队使用的空间,需要把旧空间的文件和提交记录,一起迁移. 方法:git remote 进行空间切换 1.查看当前空间名:git r ...

  5. 创建一个多进程(multiprocessing.Process)

    进程是资源的集合,每个进程至少包含一个线程 import multiprocessing #导入进程模块import time, threading #导入线程 def thread_run(): p ...

  6. WDA-FPM-3-SEARCH(OIF)

    转载:https://www.cnblogs.com/sapSB/p/10097830.html   FPM三:简单的SEARCH(OIF) 这里是使用FPM Workbench自动生成的,没有去SE ...

  7. selenium中使用chromedriver备忘

    chromedriver是chrome浏览器的webdriver的一个实现.ChromeDriver是由Chrome开发团队来完成的因而ChromeDriver不包含在selenium包中,需要从Ch ...

  8. COM组件 IDispatch 及双接口的调用

    转自:http://blog.csdn.net/cnhk1225/article/details/50555647 一.前言 前段时间,由于工作比较忙,没有能及时地写作.其间收到了很多网友的来信询问和 ...

  9. 软件工程导论复习 如何画系统流程图和数据流图 part2

    数据流图(DFD)    数据流图,简称DFD,是SA方法中用于表示系统逻辑模型的一种工具,它以图形的方式描绘数据在系统中流动和处理的过程,由于它只反映系统必须完成的逻辑功能,所以它是一种功能模型.下 ...

  10. Dynomite 安装配置

    Dynomite受Dynamo白皮书的启发,是一种用于不同存储引擎和协议的轻量级的分布式的Dynamo层. 目前包括Redis和Memcached. Dynomite支持多数据中心复制,旨在实现高可用 ...