c++编程思想里面的错误(可能c++标准变了,所以以前的东西没有更新)
第一卷 第五章 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++标准变了,所以以前的东西没有更新)的更多相关文章
- [Java编程思想-学习笔记]第3章 操作符
3.1 更简单的打印语句 学习编程语言的通许遇到的第一个程序无非打印"Hello, world"了,然而在Java中要写成 System.out.println("He ...
- Java编程思想重点笔记(Java开发必看)
Java编程思想重点笔记(Java开发必看) Java编程思想,Java学习必读经典,不管是初学者还是大牛都值得一读,这里总结书中的重点知识,这些知识不仅经常出现在各大知名公司的笔试面试过程中,而 ...
- 16条Web2.0法则的编程思想
1.在你开始之前,先定一个简单的目标.无论你是一个Web 2.0应用的创建者还是用户,请清晰的构思你的目标.就像“我需要保存一个书签”或者“我准 备帮助人们创建可编辑的.共享的页面”这样的目标,让你保 ...
- 注解的基本盘点 -- 《Java编程思想》
注解(元数据)为我们在代码中添加信息提供了一种形式化的方法,使我们可以在之后的某一个时刻非常方便地使用这些数据. ---<Java编程思想> 其实注解可以理解为一个工具类,只要使用了这个工 ...
- java编程思想第四版中net.mindview.util包下载,及源码简单导入使用
在java编程思想第四版中需要使用net.mindview.util包,大家可以直接到http://www.mindviewinc.com/TIJ4/CodeInstructions.html 去下载 ...
- C++编程思想重点笔记(下)
上篇请看:C++编程思想重点笔记(上) 宏的好处与坏处 宏的好处:#与##的使用 三个有用的特征:字符串定义.字符串串联和标志粘贴. 字符串定义的完成是用#指示,它容许设一个标识符并把它转化为字符串, ...
- java编程思想
Java编程思想,Java学习必读经典,不管是初学者还是大牛都值得一读,这里总结书中的重点知识,这些知识不仅经常出现在各大知名公司的笔试面试过程中,而且在大型项目开发中也是常用的知识,既有简单的概念理 ...
- Java编程思想(11~17)
[注:此博客旨在从<Java编程思想>这本书的目录结构上来检验自己的Java基础知识,只为笔记之用] 第十一章 持有对象 11.1 泛型和类型安全的容器>eg: List<St ...
- Java编程思想 (1~10)
[注:此博客旨在从<Java编程思想>这本书的目录结构上来检验自己的Java基础知识,只为笔记之用] 第一章 对象导论 1.万物皆对象2.程序就是对象的集合3.每个对象都是由其它对象所构成 ...
随机推荐
- leetcode551
public class Solution { public bool CheckRecord(string s) { ; ; ; var preChar = '\0'; ; i < s.Len ...
- 一个NPOI导出到excel文件的范例记录
'使用NPOI写入新创建的excel文件,导出文件: Private Sub Sub_WriteXls() Dim XlsBook As XSSFWorkbook Dim XlsSheet As XS ...
- JS实现拖动效果
有个问题就是该模块要使用定位,因为有left,top属性使用,绝对定位和相对定位都行,当然你也可使用margin-left,和margin-top这2个属性,替换left,top也是可以得 这样就不用 ...
- JPQL和SQL的比较
前言 在JAVA EE中,JPQL是专门为Java 应用程序访问和导航实体实例设计的.Java Presistence Query Language(JPQL),java持久性查询语言.它是JPA规范 ...
- jquery.ajax的url中传递中文乱码问题的解决方法
jquery.ajax的url中传递中文乱码问题的解决方法 JQuery JQuery默认的contentType:application/x-www-form-urlencoded 这才是JQu ...
- hadoop配置文件的参数含义说明
#hadoop version 查看版本号 1 .获取默认配置 hadoop2系列配置文件一共包括6个,分别是hadoop-env.sh.core-site.xml.hdfs-site.xml.map ...
- CAD2010安装说明
1. 2. 3. 4. 5. . 提供算号服务(也就是付费才能获得的注册码)... 不会的可以问的撒....
- 关于EL表达式取值的问题
EL表达式取值时,如果没有指定作用域,EL表达式会自动按照作用域的大小,从小到大依次去找;比如${s},会自动按照"pageContext,request,session,applicati ...
- 201671010127 2016—2017—2 Java怎样解决Java程序中中文乱码的问题。
这是本次第二次分享新手在编程中遇到的问题,相信很多Java新手和我一样,在Java编程中会遇到中文乱码的情况,下面我就给大家分享我遇到问题和解决问题的具体过程. 我先用Notepad++写了一个如下的 ...
- 常用数据库ID格式
转自:http://www.biotrainee.com/thread-411-1-1.html 常用数据库 ID ID 示例 ID 来源 ENSG00000116717 Ensemble ID GA ...