将 const 参数作为参数传递时出现隐秘错误消息

2023-12-21

所以我正在编写双向链表的实现。这是实现各个节点的类的构造函数:

DNode::DNode(const int a_key, const DNode* a_prev, const DNode* a_next) 
    : key(a_key), prev(a_prev), next(a_next) {}

我写的原因const int a_key, const DNode* a_prev, const DNode* a_next是因为构造函数没有理由修改它们。所以我只是想保护自己免于在构造函数内进行任何不需要的修改。这是一件好事吗?

编译输出以下错误:

dnode.cpp:6:89: 错误: 无法初始化类型的成员子对象 'DNode *' 的左值类型为 'const DNode *' DNode::DNode( const int a_key, const DNode* a_prev, const DNode* a_next ) : key(a_key), 上一个(a_prev),下一个(a_next){}

dnode.cpp:6:103: 错误:无法初始化成员 类型为“DNode *”的子对象,其左值类型为“const DNode *” DNode::DNode( const int a_key, const DNode* a_prev, const DNode* a_next ) : 键(a_key), 上一个(a_prev), 下一个(a_next) {}

我不明白错误消息。DNode*是指针类型,而不是左值。欢迎任何帮助。

===编辑===

我将我的代码修改为以下内容。

dnode.h

class DNode {

 public:

  //
  DNode( const int a_key, const DNode& a_prev, const DNode& a_next );

  //
  int get_key() const;
  DNode* get_prev() const;
  DNode* get_next() const;

  //
  void set_key( const int a_key );
  void set_prev( const DNode& a_prev );
  void set_next( const DNode& a_next );

  //
 private:

  int key;
  DNode* prev;
  DNode* next;

};

dnode.cpp

//
DNode::DNode( const int a_key, const DNode& a_prev, const DNode& a_next ) 
: key(a_key), prev(&a_prev), next(&a_next) {}

//
int DNode::get_key() const { return key; }
DNode* DNode::get_prev() const { return prev; }
DNode* DNode::get_next() const { return next; }

//
void DNode::set_key( const int a_key ) { key = a_key; }
void DNode::set_prev( const DNode& a_prev ) { prev = &a_prev; }
void DNode::set_next( const DNode& a_next ) { next = &a_next; }

我收到以下错误消息

dnode.cpp:6:89: 错误: 无法初始化类型的成员子对象 'DNode *' 的右值类型为 'const DNode *' DNode::DNode( const int a_key, const DNode& a_prev, const DNode& a_next ) : key(a_key), 上一个(&a_prev),下一个(&a_next){}

dnode.cpp:6:104: 错误:无法初始化成员 类型为“DNode *”的子对象,其右值为“const DNode *”类型 DNode::DNode( const int a_key, const DNode& a_prev, const DNode& a_next ) : key(a_key), prev(&a_prev), next(&a_next) {}

dnode.cpp:15:52:错误:分配给“DNode *” 不兼容类型 'const DNode *' void DNode::set_prev( const DNode& a_prev ) { 上一个 = &a_prev; }

dnode.cpp:16:52:错误:从不兼容的类型分配给“DNode *” 'const DNode *' void DNode::set_next( const DNode& a_next ) { next = &a_下一个; }

再次说明我写这篇文章的原因const DNode& a_prev在构造函数的参数列表中是因为我想防止a_prev避免被构造函数修改(但我不在乎它是否在外部修改)。但由于它不起作用,我可能误解了const在此背景下。


我认为在你的类中你有数据成员(你没有显示),定义如下:

DNode* prev;
DNode* next;

在构造函数中,你有const DNode*参数 (a_prev and a_next):

DNode::DNode(const int a_key, const DNode* a_prev, const DNode* a_next) 
   : key(a_key), prev(a_prev), next(a_next) {}

const DNode*参数意味着你有一个指向DNode那是const,即DNode指出不能修改。
但你想将它分配给DNode*数据成员,即非const(即DNode指向can进行修改)。
您不能分配受以下约束的内容const(即无法修改),到非const(即可以修改)。

以下代码应该可以工作:

// Remove 'const' from the pointers!
DNode::DNode(const int a_key, DNode* a_prev, DNode* a_next) 
  : key(a_key), prev(a_prev), next(a_next) {}

如果你想使用这个“const关于输入参数”的风格,比如const int a_key,你应该把const指针符号之间(*) 和参数名称,例如

// Proper placing of 'const'
DNode::DNode(const int a_key, DNode* const a_prev, DNode* const a_next) 
  : key(a_key), prev(a_prev), next(a_next) {}

这意味着a_prev and a_next无法重新分配以指向其他数据;但他们确实指出了一些事情can被修改(aDNode*).

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

将 const 参数作为参数传递时出现隐秘错误消息 的相关文章

随机推荐

  • 如何从 Java 数组中删除一个条目,以便其他条目保持顺序

    原谅笨拙的标题 我想编写一个方法 从数组中删除特定条目 但不会在数组中留下空间隙 例如 如果一个字符串数组包含 aa bb cc dd ee 系统将提示用户输入要删除的数字 该方法将找到该条目的索引 删除该索引 然后将空条目移动到最后一个插
  • OS X / C 已安装字体列表

    我正在尝试以编程方式获取 C 或 Python 中已安装字体的列表 我需要能够在 OS X 上执行此操作 有人知道怎么做吗 安装了 PyObjC 的 Python Mac OS X 10 5 就是这种情况 因此此代码无需安装任何东西即可运行
  • %date:/=% 中的 :/= 是什么意思?

    在寻找在 Windows 中创建以日期命名的目录的方法时 我遇到了这个问题 https stackoverflow com q 5485853 520162 with that https stackoverflow com a 54859
  • VB6 清单无法在 Windows 7 上运行

    我为在 Windows 7 上运行的 VB6 应用程序创建了一个清单文件 不是为了任何视觉样式更改 只是为了确保它访问通用注册表而不是虚拟化注册表 exe 名称为 Capadm40 exe 清单名为 Capadm40 exe manifes
  • 将数据从 js 发送到 php、从 php 发送到 mysql 以及 REST json 响应时所需的正确编码/转义/htmlentities 是什么

    这是我经常遇到的情况 我通常最终会求助于尝试再尝试的方法 直到数据起作用 我想 SO 会知道维护数据而不弄乱 json 的最佳实践是什么 假设我要发送的数据是最烦人的文本数据 特殊字符 我们还假设我想将所有内容保留为 utf8 并且我的 m
  • 为什么 {0} 始终是有效的结构初始值设定项? [复制]

    这个问题在这里已经有答案了 考虑以下 C 代码 typedef struct abc int a 4 int b int c abc t abc t x 0 我发现将其与gcc c Wall Wextra pedantic std c99不
  • 为什么 iOS Safari 和 Chrome 不滚动页面并在复选框和单选输入字段上显示验证消息?

    鉴于此示例代码 为什么在 iOS Safari Chrome 上提交表单时 浏览器不会将页面滚动到顶部并在所需的单选框上显示验证错误 这在文本输入字段以及这些浏览器的桌面版本和 Android 上按预期工作 如果删除文本填充以缩短页面以使字
  • 枚举被解释为字符串

    当用户登录时 我设置一个 sessionScope 对象 并且该 bean 对象由几个其他 bean 组成 这些bean的属性之一是枚举 但我发现EL无法获取枚举类的属性 并且它只能获取java bean对象的属性 所以我决定为枚举创建一个
  • Cypher Neo4J - 使用 MERGE 进行 CASE 表达

    我正在尝试根据特定条件在 Cypher 中实现逻辑 CASE声明 我会创建一些节点和关系 代码如下 MATCH g Game PLAYER gt u User r1 AT gt b1 Block NEXT gt b2 Block WHERE
  • 从 C# 运行 .bat 文件

    我面临一个奇怪的问题 我有一个 bat 文件 其中包含用于重命名文件的代码 当我手动打开 bat 文件时 它会执行上面写的操作 即重命名文件 但是当我尝试打开时它以 C 方式编程 它不执行任何操作 它只是打开文件并且不编译它写入的内容 我输
  • 如何在 QuickCheck 测试中悄悄捕获恐慌?

    在我的测试中溢出 支持 https crates io crates overflower support板条箱 我发现我收到了很多关于恐慌的虚假报告 这些报告已经使用std panic catch unwind 这有点不幸 因为它掩盖了可
  • Windows 上的 django-admin.py 和 virtualenv 问题

    在我的系统中 系统范围内安装了 Django 1 2 3 C gt python c import django print django get version 1 2 3 C gt django admin py version 1 2
  • 如何将 MySQL 设置为 Rails 3 中的默认数据库?

    我去年 4 月开始使用 Rails 2 但今年 6 月停止使用 因为我认为在 Rails 3 发布时学习它会更实用 因为它的很多内容都被完全重构和重组 我曾经使用 Ubuntu 10 04 使用 SQLite3 作为默认数据库 但现在我使用
  • 部分表单类 C# - 仅显示类的代码视图

    我有一个用 C 编写的空白表单项目 我想将函数和事件分离到表单类上的不同代码文件中 为了当它变得很大并且多人在 CodeControl 上使用它时使其更易于管理 所以我创造了 Form1 Functions cs Form1 Events
  • 如何解决 React Native run-android 中的“您的项目中需要有 MainApplication”

    我从博览会上被驱逐 并尝试react native run android 我收到此错误 FAILURE Build failed with an exception Where Script C Users simil OneDrive
  • 单一类型特征中的双向链接

    我正在尝试创建一个特征 它实现具有双向链接的树 以便当节点添加父节点时 该节点将添加到父节点的子节点中 我得到的错误如下 类型不匹配 找到 PolyTree this type 具有基础类型 PolyTree T 必需 T 知道为什么此代码
  • HTML5 / JS 线性仪表 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我想显示一个线性仪表 如融合图 http docs fusioncharts com flex charts Contents Wid
  • 从类方法调用实例方法

    所以我需要从 Objective C 中的类方法调用一些实例方法 例子 id barWithFoo NSFoo self foo Raises compiler warning void foo cool stuff 所以我的问题是 Sta
  • 通过 AT 命令终止语音通话

    我正在从事一个涉及 Arduino 和 TC35 GSM 模块的业余爱好项目 一切都很顺利 但我想知道是否有一个 AT 命令来终止语音通话 ATD 电话号码 因为我似乎无法在以下任何一个中找到一个我搜索过的文献 谢谢 戴夫 而 经典 命令A
  • 将 const 参数作为参数传递时出现隐秘错误消息

    所以我正在编写双向链表的实现 这是实现各个节点的类的构造函数 DNode DNode const int a key const DNode a prev const DNode a next key a key prev a prev n