千家信息网

C++编译的编写及其代码问题分析

发表于:2025-11-07 作者:千家信息网编辑
千家信息网最后更新 2025年11月07日,这篇文章主要介绍"C++编译的编写及其代码问题分析",在日常操作中,相信很多人在C++编译的编写及其代码问题分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"C++编译
千家信息网最后更新 2025年11月07日C++编译的编写及其代码问题分析

这篇文章主要介绍"C++编译的编写及其代码问题分析",在日常操作中,相信很多人在C++编译的编写及其代码问题分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"C++编译的编写及其代码问题分析"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

如果这是你购买的库的设计问题,你对它无计可施(除了换一个更好的库),但你可以将你自己的代码组织得更好一些,以求得将修改代码后的重新编译工作降到最少。这样的设计会更好,更有可维护性,因为它们展示了更好的概念上的分离。

看看这个典型的面向对象的C++编译程序例子:

class Shape {       public:     // 使用Shapes的用户的接口           virtual void draw() const;           virtual void rotate(int degrees);           // ...       protected:  // common data (for implementers of Shapes)           Point center;           Color col;           // ...       };           class Circle : public Shape {       public:            void draw() const;           void rotate(int) { }           // ...       protected:           int radius;           // ...       };           class Triangle : public Shape {       public:            void draw() const;           void rotate(int);           // ...       protected:           Point a, b, c;           // ...       };

设计思想是,用户通过Shape的public接口来操纵它们,而派生类(例如Circle和Triangle)的实现部分则共享由protected成员表现的那部分实现(implementation)。这不是一件容易的事情:确定哪些实现部分是对所有的派生类都有用的,并将之共享出来。

因此,与public接口相比,protected成员往往要做多得多的改动。举例来说,虽然理论上"中心"(center)对所有的图形都是一个有效的概念,但当你要维护一个三角形的"中心"的时候,是一件非常麻烦的事情--对于三角形,当且仅当它确实被需要的时候,计算这个中心才是有意义的。

protected成员很可能要依赖于实现部分的细节,而Shape的用户(译注:user此处译为用户,指使用Shape类的C++编译,下同)却不见得必须依赖它们。举例来说,很多(大多数?)使用Shape的代码在逻辑上是与"颜色"无关的,但是由于Shape中"颜色"这个定义的存在,却可能需要一堆复杂的头文件,来结合操作系统的颜色概念。

当protected部分发生了改变时,使用Shape的代码必须重新编译--即使只有派生类的实现部分才能够访问protected成员。于是,基类中的"实现相关的信息"(information helpful to implementers)对用户来说变成了象接口一样敏感的东西,它的存在导致了实现部分的不稳定,用户代码的无谓的重编译(当实现部分发生改变时),以及将头文件无节制地包含进用户代码中(因为"实现相关的信息"需要它们)。有时这被称为"脆弱的基类问题"(brittle base class problem)。

一个很明显的解决方案就是,忽略基类中那些象接口一样被使用的"实现相关的信息"。换句话说,使用接口,纯粹的接口。也就是说,用抽象基类的方式来表示接口:

class Shape {       public:     //使用Shapes的用户的接口           virtual void draw() const = 0;           virtual void rotate(int degrees) = 0;           virtual Point center() const = 0;           // ...               // 没有数据       };           class Circle : public Shape {       public:            void draw() const;           void rotate(int) { }           Point center() const { return center; }           // ...       protected:           Point cent;           Color col;           int radius;           // ...       };           class Triangle : public Shape {       public:            void draw() const;           void rotate(int);           Point center() const;           // ...       protected:           Color col;           Point a, b, c;           // ...       };

现在,用户对C++编译与派生类的实现部分的变化之间的关系被隔离了。我曾经见过这种技术使得编译的时间减少了几个数量级。

到此,关于"C++编译的编写及其代码问题分析"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!

编译 代码 接口 用户 部分 问题 C++ 分析 成员 学习 信息 概念 颜色 设计 三角形 举例来说 事情 文件 时候 更多 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 数据库网上购物系统的系统概述 国开数据库应用技术综合应用题 科技与互联网有关的群名 网络安全日征信信息 pc我的世界服务器创建 戴尔服务器硬盘更换 沈阳航空航天大学文献数据库 软件开发项目工期 如何做好网络安全工作与生产 企业级软件开发 java 实用数据库期末考试题 网络安全形势警示教育范文 游戏软件开发哪一家好 服务器怎么设置另一个数据库 软件开发招标文件编制说明 网络安全作战指挥体系 数据库基础与实践技术电子 两个服务器怎么备份数据 软件开发项目经 本职工作 河南储存服务器云主机 安卓软件开发页面布局代码 网络安全小卫士的申报理由 网络安全p p t 戴尔服务器硬盘更换 徐人凤数据库2008答案 软件开发项目工期 关系数据库中链接的类型 防欺凌网络安全手抄报 小程序怎样调用服务器里的地图 软件开发遵循的规范
0