第一卷  第五章 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. Appium清空EditText

    在使用appium过程中,发现sendkeys和clear方法并不太好使,封装模拟手工一个一个删除 这里用到keyEvent,具体内容请参考api http://appium.github.io/ja ...

  2. XCode iOS Simulator 模拟器

    XCode7.3下,默认带了iOS 9.3 Simulator,iOS 8.4 Simulator总是安装不成功. mac os X,里的模拟器,全屏 ,windows win键+1/2/3 切换全屏 ...

  3. as3 名称

    加密算法方式: https://www.cnblogs.com/wei2yi/p/3484170.html AES  (Advanced Encryption Standard) DES(Data E ...

  4. python list()总结

      # 1 列表的创建,用方括号表示[ ] name=['xiaolei','xiaoman','lixia','xiaolei'] # 2 列表的查询,通过索引值差值,第一位索引为0 #倒数第一个 ...

  5. 9 random模块

    1.ramdom模块主要方法 random.random()函数是这个模块中最常用的方法了,它会生成一个随机的浮点数,范围是在0.0~1.0之间. random.uniform()正好弥补了上面函数的 ...

  6. Datetime 24小时制

    24小时制: DateTime dt = DateTime.Now; string dt24 = dt.ToString("yyyy-MM-dd HH:mm:ss"); 12小时制 ...

  7. python之类的相关知识

    面向对象技术简介 类: 用来描述具有相同的属性和方法的对象的集合.它定义了该集合中每个对象所共有的属性和方法.对象是类的实例. 类变量:类变量在整个实例化的对象中是公用的.类变量定义在类中且在函数体之 ...

  8. GPU寄存器相关

    1,shader model 3.0 只有256个常量寄存器,32个临时寄存器.对应dx9, opengl2.0, opengles2.0 2,shader model 4.0 有65536个寄存器, ...

  9. nodejs文件操作笔记

    nodejs添加了流的概念,通过流操作文件如行云流水,比早前便利畅快多了. 先来第一个例子,我们建一个stream.js文件,里面内容如下: var fs = require("fs&quo ...

  10. delphi TEdit透明

    unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms ...