C++ 隐式转换运算符

2024-03-15

我正在尝试在 C++ 中找到一个很好的继承解决方案。

我有一个矩形类和一个正方形类。 Square 类不能公开继承 Rectangle,因为它不能完全满足矩形的要求。例如,矩形可以单独设置其宽度和高度,这对于正方形来说当然是不可能的。

所以,我的困境。 Square 显然会与 Rectangle 共享很多代码;它们非常相似。

例如,如果我有一个类似的函数:

bool IsPointInRectangle(const Rectangle& rect);

它也应该适用于正方形。事实上,我有很多这样的功能。

因此,在创建我的 Square 类时,我想我将使用私有继承和可公开访问的 Rectangle 转换运算符。所以我的方形类看起来像:

class Square : private Rectangle
{
    public:
        operator const Rectangle&() const;
};

然而,当我尝试将 Square 传递给 IsPointInRectangle 函数时,我的编译器只是抱怨在该上下文中“矩形是不可访问的基数”。我希望它能注意到矩形运算符并使用它。

我想做的事情可能吗?

如果这行不通,我可能会将 Rectangle 的一部分重构为可变矩形 http://en.wikipedia.org/wiki/Circle-ellipse_problem#Factor_out_modifiers class.

Thanks.


你可以上一堂课ImmutableRectangle,没有任何突变并且只有const方法,从中您可以正确导出两者Rectangle,并且分别,ImmutableSquare并且,由此,Square。请注意,除去可变性,IS-A关系doeshold——一个不可变的正方形 IS-A 不可变的矩形:可变性是唯一严重的问题,因此通过将其分解出来,您可以获得一些实质性的代码重用(对于所有const使用——实际上不使用或不需要可变性的那些)。

只要(不可变)基实际上没有类不变量,沿继承引入可变性就可以了rely关于不变性特征;当然,一个不可变的对象可以正确地从const指向可变版本的指针或引用(大概在单独的内联友元函数中,以避免基类对派生类的依赖;-)以便合理方便地使用。

Edit:一条评论可以理解地表达了疑虑,因为“mutabe 不是一成不变的”:要推理这一点,你需要理解什么是“IS-A”means...确实如此not意思是科尔日布斯基 http://en.wikipedia.org/wiki/Alfred_Korzybski-否认”is身份”:这意味着LSP http://en.wikipedia.org/wiki/Liskov_substitution_principle。仔细检查约束条件,这意味着:协变、逆变、较弱相等的前提条件、较强相等的后置条件等,因为它们适用于const methods基类(不可变)和派生类(可变)。正如我在上一段中提到的,您会发现类不变量是唯一的问题,因此只要避免将不变性断言为类不变量,您就陷入了三叶草;-)。

也许命名基类会有所帮助NotNecessarilyMutableRectangle因为它没有assert作为类不变量的不变性;这种非常精确的命名可能在哲学上令人放心,但在日常编码中可能有点不方便。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ 隐式转换运算符 的相关文章

  • 使用 ## 和 __LINE__ 创建 C 宏(与定位宏的标记串联)

    我想创建一个 C 宏来创建一个基于名称的函数 在行号上 我想我可以做类似的事情 真正的函数在大括号内有语句 define UNIQUE static void Unique LINE void 我希望能扩展到类似的内容 static voi
  • 在 JavaScript 中引用 C# 变量

    我已经阅读了很多线程 但我不明白为什么这不起作用 我正在创建一个将用作导航栏的 SharePoint Web 部件 一切都很顺利 直到我尝试在 JS 代码中引用 C 变量 这是来自 VisualWebPart1UserControl asc
  • 如何准备sql语句并绑定参数?

    不幸的是 文档 http www sqlite org完全缺乏示例 这真的很奇怪 就好像它假设所有读者都是优秀的程序员一样 然而 我对C 并且无法真正从文档中弄清楚如何真正准备和执行语句 我喜欢它的实施方式PDO for PHP 通常 我只
  • C# 中输入按键

    我尝试了这段代码 private void textBox1 KeyPress object sender KeyPressEventArgs e if Convert ToInt32 e KeyChar 13 MessageBox Sho
  • 如何将 mat 转换为 array2d

    我为dlib http dlib net face landmark detection ex cpp html那里的面部地标代码使用 array2d 来获取图像 但我喜欢使用 Mat 读取图像并转换为 array2d 因为 dlib 仅支
  • 弹出 x86 堆栈以访问函数 arg 时出现分段错误

    我正在尝试链接 x86 程序集和 C 我的C程序 extern int plus 10 int include
  • 如何在控制器中使用多个 DBContext

    如何在控制器中使用多个 DBContext 我尝试以不同的方式重载构造函数 一些控制器 public C1 DBContext1 a DBContext2 b DBContext3 c public C1 DBContext1 a publ
  • 如何从命名空间内重载运算符<<

    这是我能想到的最小的包含示例 首先是类的标题 每当使用 pragma once ifndef EURO H define EURO H include
  • Xcode 新手无法用 C++ 打开文件?

    我一直在我参加的课程中使用 Windows 但我正在尝试运行基本代码来弄清楚如何从 Xcode 上的文件打开 关闭 输入 输出 而我通常在 Visual Studio 上使用的代码不是不知道为什么 谢谢 include
  • 如何检查给定调用站点的重载决策集

    如何检查重载解析集 我在多个调用站点中使用了 4 个相互竞争的函数 在一个调用站点中 我期望调用一个函数 但编译器会选择另一个函数 我不知道为什么 这不是微不足道的 为了了解发生了什么 我正在使用enable if disable if打开
  • C# 中不区分大小写的替换不使用正则表达式?

    有没有一种方法可以在不使用 C 中的正则表达式的情况下对字符串进行不区分大小写的替换 像这样的东西 string x Hello x x Replace hello hello world 你可以尝试类似的东西 string str Hel
  • VS C# 中的依赖地狱,找不到依赖项

    我创建了一个图表 C 库 我们称之为chartlibrary 它本身依赖于多个第三方 dll 文件 在另一个可执行项目中 我们称之为chartuser 我参考了chartlibrary项目 两个项目位于 Visual Studio 中的同一
  • C# SignalR 异常 - 连接在收到调用结果之前开始重新连接

    我正在开发 2 个应用程序 第一个是 C 控制台应用程序 另一个是 Asp net Web 应用程序 我正在使用 SignalR 连接两者 这是我的 C 控制台应用程序 客户端 public class RoboHub public sta
  • C# 从今天起 30 天

    我需要我的应用程序从今天起 30 天后过期 我会将当前日期存储在应用程序配置中 如何检查应用程序是否已过期 我不介意用户是否将时钟调回来并且应用程序可以正常工作 用户太愚蠢而不会这样做 if appmode Trial string dat
  • 在 boost 元组、zip_iterator 等上使用 std::get 和 std::tie

    我有哪些使用选择std get lt gt and std tie lt gt 与增强结构一起 例子 我想使用基于范围的 for 循环在多个容器上进行迭代 我可以实施zip函数 它使用boost zip iterator include
  • 什么是 C++11 扩展 [-Wc++11-extensions]

    我需要一些帮助来了解此错误发生的位置 警告 非静态数据成员的类内初始化是 C 11 扩展 Wc 11 extensions 这是它来自的代码部分 typedef struct Hand bool straight false bool fl
  • 如何使用 MongoDB 实现 ASP.NET Core 3.1 Identity?

    是一个 API 用于简化后端和逻辑代码来管理用户 密码 个人资料数据 角色 声明 令牌 电子邮件确认等 对于 Visual Studio 来说 支撑脚手架 https learn microsoft com en us aspnet cor
  • 如何在c#中获取斐波那契数

    伙计们 我有一个关于斐波那契的问题 如何获得斐波那契数列 该数字也将以用户输入结束 例如 如果我输入 21 则输出必须为 0 1 1 2 3 5 8 13 21 这是我的代码 static void Main string args int
  • 从 git 签出后 nuget dll 丢失

    I have a C solution containing different projects On those projects I have some normal nuget packages like Newtonsoft Js
  • 在地图上使用 find

    如何使用 find 和 aconst iterator如果你有一个地图定义为 typedef std pair

随机推荐

  • 创建本机 C++ OpenGL 3D 编辑器并将其用作 C# 中的 WinForms 或 WPF 控件

    我想创建一个简单的3D编辑器程序 并且我不喜欢C windows编程 但我也不想在使用 OpenGL 时弄乱托管代码 因此 可以在本机 C 中创建一个将托管 OpenGL 3D 绘图表面的控件 无需其他控件 也具有接口 方法和属性 并将其用
  • Graphql @include 带表达式

    我正在实现一个查询 该查询应该根据用户登录状态提供响应中的某些字段 具体来说 我想得到 点率 仅当字段 authenticationToken已通过并且希望避免通过 authenticated在下面的查询中 我想避免发送的原因 authen
  • Linux 上的 APL 键映射 (GNU APL)

    我的祖父是 60 年代 70 年代 IBM 的一名 APL 程序员 他最近开始使用 Linux 我一直在帮助他设置和使用 GNU APL http www gnu org software apl http www gnu org soft
  • Google Analytics 跟踪中的 AnalyticsReceiver

    在Google Analytics Tracking Ver1中 它有类AnalyticsReceiver 但是当我使用 Google Analytics Tracking Ver2 时 它还没有AnalyticsReceiver班级 我不
  • 在 Android 上使用 NFC 软件卡模拟控制完整的 APDU

    我正忙于开发一个应用程序来模拟 Nexus 7 上使用 CM10 1 与 ACR122U102 读取器 写入器的正常 APDU 通信 我发现这个博客是关于软件卡模拟 http nelenkov blogspot nl 2012 10 emu
  • Visual Studio 2010无法启动程序.dll

    我的 Visual Studio 2010 有问题 当我单击 开始调试 按钮时 它就开始调试 似乎没有错误 我只是在其上创建一个 按钮 但它会显示Unable to start program c users xx dll 现在有人怎么解决
  • 使用“ref”键将“引用类型”作为参数传递给方法是否有意义? [复制]

    这个问题在这里已经有答案了 可能的重复 C 引用类型变量的 ref 有什么用 https stackoverflow com questions 961717 c what is the use of ref for reference t
  • 按顺序数字分组

    我有一些这样的数据 row id 1 1 2 36 3 37 4 38 5 50 6 51 我想查询它看起来像这样 row id group 1 1 1 2 36 2 3 37 2 4 38 2 5 50 3 6 51 3 这样我就可以按数
  • PHP 现在设置格式 YYYY-MM-DD

    我需要以这种格式将变量设置为当前日期 例如 2012 05 12 我知道这是 YYYY MM DD 吗 我试过了 date date yyyy mm dd strtotime now 但这并没有将日期保存到 mysql 因此它显示为 000
  • 如何将 OpenIdconnect 与 istio 集成?

    我想使用以下方式对最终用户进行身份验证JWT由 OpenId 连接提供者 如 keycloak 或 auth0 etc 提供istio服务网格 但我可能无法成功集成它 因为我对 JWT auth 和 istio 很陌生 有人可以提供正确的信
  • 防止“持久对象异常”

    我有一个非常基本的 JAX RS 服务 BookService下面的类 允许创建类型的实体Book 也见下文 POST有效负载 acquisitionDate 1418849700000 name Funny Title numberOfP
  • Haskell 重叠实例和类型函数

    我有以下类型类 它模拟了类似 SQL 的查询优化 class OptimizableQuery q where type Optimized q optimize q gt Optimized q instance Query q gt O
  • Asp.Net MVC:如何在网址中启用破折号?

    我想在我的网址中用破折号分隔单词 所以而不是 MyController MyAction 我想要 My Controller My Action 这可能吗 您可以像这样使用 ActionName 属性 ActionName My Actio
  • 显示日期格式[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我想显示 2 March 2011
  • 如何在python中将文件保存到特定目录?

    目前 我正在使用此代码来保存下载的文件 但它将它们放在运行它的同一文件夹中 r requests get url with open file name pdf wb as f f write r content 如何将下载的文件保存到我选
  • 如何快速找到接口方法的实现? [复制]

    这个问题在这里已经有答案了 有没有一种快速方法可以找到接口的方法 属性 等的所有实现 而不是引用 这是一些示例代码 public class SomeClass IBaseClass public Int32 GetInt return 1
  • 在多语言操作系统上使用 Hyperic SIGAR 时出现“java.library.path 中没有 sigar-x86-winnt.dll”错误

    我在用金丝桃 SIGAR http www hyperic com products sigar库作为我的安装程序中的第三方库 我的安装程序将所有第三个 lib 文件解压到 TEMP user 文件夹中 在英语操作系统上一切都很好 但是当我
  • 使用 NLTK 和德语语料库从名词获取性别

    我正在尝试 NTLK 我的问题是图书馆是否可以检测德语名词的性别 我想接收此信息以确定文本是否是性别中立的 浏览此处获取更多信息 https en wikipedia org wiki Gender neutrality in langua
  • 使用 PHPExcel 循环工作表

    我正在使用 PHPExcel 库读取 Excel 文件并对其进行处理 我想循环浏览每个工作表 我检查了文档 我所能找到的只是更改活动工作表索引或仅加载指定的工作表 如何循环浏览所有工作表 感谢您的任何帮助 这是文档的循环示例 供参考
  • C++ 隐式转换运算符

    我正在尝试在 C 中找到一个很好的继承解决方案 我有一个矩形类和一个正方形类 Square 类不能公开继承 Rectangle 因为它不能完全满足矩形的要求 例如 矩形可以单独设置其宽度和高度 这对于正方形来说当然是不可能的 所以 我的困境