C++11通过拷贝构造器拷贝const字段(待解决)
问题梗概如标题所述。
在今天实现Token类的时候,遇到的问题。
我希望将Token类设定为immutable属性的,这样实现的方式是将这个类内的所有字段均设置为const型,同时每个字段均为public可访问型。
类内主要有两个字段:mark(枚举类型,用于标记当前Token对象所代表的具体类型,比如INT,CHAR等);匿名union字段,用于存储mark标记下对应的具体值。
当我把两个字段均设置为const型时,拷贝构造器将会面临一些实现上的困难。
简言之,如果这样来写拷贝构造器:
class Token {
public:
const Mark mark;
const union {
int ival;
char cval;
}
Token(const Token &tk) : mark(tk.mark) {
if (tk.mark == INT) {
ival = tk.ival;
} else if (tk.mark == CHAR) {
cval = tk.cval;
}
} // 存在问题
Token &operator=(const Token &tk) {
// 问题类似
}
...
};
将会因为const字段无法被赋值而报错。
问题的关键就在于,只有确定了mark的具体值时,才能确定应该拷贝匿名union字段的哪个字段值。
暂时未解决该问题,望读者分享自己的想法。
此外,在编译过程中,遇到了clang的如下警告:
warning: all paths through this function will call itself
[-Winfinite-recursion]
1 warning generated.
报错代码:
std::ostream &operator<<(std::ostream &os, const Token &tok) {
os << "Tk:" << tok.getMark() << " " << tok.getLexeme();
return os;
}
其中getMark方法定义如下:
Mark Token::getMark() const {
return mark;
}
即直接将mark字段值返回(该字段是一个枚举类类型值,枚举类为Mark)。
此时执行Warning代码,会发现程序循环输出"Tk:"(Tk:Tk:Tk:Tk:....)。
此时,需要将枚举类型值强制转换为int型,实现正常输出。修改后的代码:
std::ostream &operator<<(std::ostream &os, const Token &tok) {
os << "Tk:" << (int)tok.getMark() << " " << tok.getLexeme();
return os;
}
至于为何出现这样的问题,初步猜测是和枚举类的内部实现有关。
针对出现这个问题的具体原因,欢迎分享想法。
2019.09.19
Modnar
C++11通过拷贝构造器拷贝const字段(待解决)的更多相关文章
- C/C++(C++拷贝构造器,赋值运算符重载)
拷贝构造器 由己存在的对象,创建新对象.也就是说新对象,不由构造器来构造,而是由拷贝构造器来完成.拷贝构造器的格式是固定的. class 类名 { 类名(const 类名 & another) ...
- [c++基础]3/5原则--拷贝构造函数+拷贝赋值操作符
/* * main.cpp * * Created on: Apr 7, 2016 * Author: lizhen */ #include <iostream> #include &qu ...
- Win7 64位 + LoadRunner 11录制时弹不出IE的解决办法 Win7 64位 + LoadRunner 11录制时弹不出IE的解决办法
Win7 64位 + LoadRunner 11录制时弹不出IE的解决办法 Win7 64位 + LoadRunner 11录制时弹不出IE的解决办法 1. 卸载IE9( 装了Win7 64位后,默认 ...
- 拷贝构造函数和const成员函数
实验原因 说明如何使用const描述保护类数据不会意外修改. 编译环境 vc6sp6 + win7x64 工程下载 copyConstruction_constMemberFunction.zip ...
- C++11如何减少内存拷贝次数
C++11中出现了很多迷人的特性.例如智能指针实现高效的内存管理,std::bind和std::function函数封装器,以及lambda实现的函数对象语法糖,都是使我着迷的地方. 而C++11最大 ...
- C++ 拷贝构造函数之const关键字
class Complex { public: //拷贝构造函数1 Complex(const Complex &c); //拷贝构造函数2 Complex(Complex &c); ...
- 拷贝构造函数 & 拷贝赋值运算符
一.拷贝构造函数 1. 形式 class A { public: // ... A(const A &); // 拷贝构造函数 }; 2. 合成拷贝构造函数 编译器总会为我们合成一个拷贝构造函 ...
- Installshield更新时,新加dll未拷贝至安装目录问题完美解决【原创】
最近在发现在开发过程中新增的目录或文件(特别是dll\ocx\exe等二进制文件),在升级安装时拷贝失败. 经过一周的研究,完美解决办法: 对于新增的文件或目录,放到一个新的component中,并且 ...
- Python 关于拷贝(copy)汇总(列表拷贝 // 字典拷贝 // 自定义对象拷贝)
1.列表拷贝 引用是指保存的值为对象的地址.在 Python 语言中,一个变量保存的值除了基本类型保存的是值外,其它都是引用,因此对于它们的使用就需要小心一些.下面举个例子: 问题描述:已知一个列表, ...
随机推荐
- Python3 post 嵌套json
目录 python3 post json burpsuite 抓取 python requests 数据包 小结 python3 post json 前些天python3 post出现的小问题做下记录 ...
- WordPress 安装教程
1.要安装WordPress,先看他的环境要求 2.环境符合后,直接去官网下载 WordPress(点击去官网) 下载最新的安装包 3.下载解压后,直接在浏览器中访问 会自动跳转到安装界面 http: ...
- linux下使用crontab新建定时任务
我安装了一个全文搜索的插件,但是需要生成索引才能使用,但是不能手动生成索引,所以说呢,我就加了一个定时任务, 一.首先vim /etc/crontab 打开文件 我根据上面的提示加了用户名,但是看到其 ...
- go get下载包失败问题
文章引用自 解决go get下载包失败问题 从github克隆 golang在github上建立了一个镜像库,如https://github.com/golang/net就对应是 https://go ...
- PHP加JS实现分片上传,断点续传
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"/> <title> ...
- numpy.bincount正确理解
今天看了个方法,numpy.bincount首先官网文档: numpy.bincount numpy.bincount(x, weights=None, minlength=0) Count numb ...
- 《FA分享》---创业学习--训练营直播第二课--HHR
盛沛涵,以太白泽董事 一,基金投资的出发点: 1,这个赛道是否只有头部一两名有机会,如果不是,投的概率更大. 2, 基金投资的判断逻辑: 1.我是不是要在这个赛道布局 2.这个赛道分布如何,有 ...
- scrapy item处理----cooperator和parallel()函数
twisted的task之cooperator和scrapy的parallel()函数 本文是关于下载结果返回后调用item处理的过程实现研究. 从scrapy的结果处理说起 def handle_s ...
- python splash scrapy
python splash scrapy 1. 前言 slpash是一个渲染引擎,它有自己的api,可以直接访问splash服务的http接口,但也有对应的包python-splash方便调 ...
- GRE Over IPSec配置
路由器GRE over IPSec站点到站点VPN 问题分析:对于前面的经典的IPSec VPN的配置来说,兼容性较好,适合于多厂商操作的时候,但是这种经典的配置方式不适合在复杂的网路 ...