首页 > 编程语言 >C++ //练习 19.21 编写你自己的Token类。

C++ //练习 19.21 编写你自己的Token类。

时间:2024-08-24 21:26:59浏览次数:8  
标签:string sval 19.21 C++ tok Token STR operator

C++ Primer(第5版) 练习 19.21

练习 19.21 编写你自己的Token类。

环境:Linux Ubuntu(云服务器)
工具:vim

 

代码块
class Token{
	public:
	Token(): tok(INT), ival(0) {}
	Token(const Token &t): tok(t.tok) { copyUnion(t); }
	Token &operator=(const Token&);
	~Token() { if(tok == STR) sval.~string(); }
	Token &operator=(const std::string&);
	Token &operator=(char);
	Token &operator=(int);
	Token &operator=(double);

	private:
	enum {INT, CHAR, DBL, STR} tok;
	union{
		char cval;
		int ival;
		double dval;
		std::string sval;
	};
	void copyUnion(const Token&);
};

Token &Token::operator=(int i){
	if(tok == STR){
		sval.~string();
	}
	ival = i;
	tok = INT;
	return *this;
}

Token &Token::operator=(char c){
	if(tok == STR){
		sval.~string();
	}
	cval = c;
	tok = CHAR;
	return *this;
}

Token &Token::operator=(double d){
	if(tok == STR){
		sval.~string();
	}
	dval = d;
	tok = DBL;
	return *this;
}

Token &Token::operator=(const std::string &s){
	if(tok == STR){
		sval = s;
	}
	else{
		new(&sval) string(s);
	}
	tok = STR;
	return *this;
}

void Token::copyUnion(const Token &t){
	switch(t.tok){
		case Token::INT: ival = t.ival; break;
		case Token::CHAR: cval = t.cval; break;
		case Token::DBL: dval = t.dval; break;
		case Token::STR: new(&sval) string(t.sval); break;
	}
}

Token &Token::operator=(const Token &t){
	if(tok == STR && t.tok!= STR) sval.~string();
	if(tok == STR && t.tok == STR){
		sval = t.sval;
	}
	else{
		copyUnion(t);
	}
	tok = t.tok;
	return *this;
}

标签:string,sval,19.21,C++,tok,Token,STR,operator
From: https://blog.csdn.net/navicheung/article/details/141504490

相关文章

  • C++ //练习 19.23 为你的Token类添加移动构造函数和移动赋值运算符。
    C++Primer(第5版)练习19.23练习19.23为你的Token类添加移动构造函数和移动赋值运算符。环境:LinuxUbuntu(云服务器)工具:vim 代码块classToken{ public: Token():tok(INT),ival(0){} Token(constToken&t):tok(t.tok){copyUnion(t);} Token&operator=(......
  • C++基础/限定符及一些关键字在限定函数的作用
    在学习中发现对const在限定函数的作用有些模糊,以下为笔者的学习总结1.5cv限定符及一些关键字在限定函数的作用c(const)v(volatile)const:用于表示该函数不会改变类的成员变量,所以是可以修改全局变量的volatile:用于告诉编译器该对象可能会被程序外部修改#include<iostream>......
  • c++贪心、模拟超详细讲解
    一、贪心算法基础1.1定义与原理定义:贪心算法是一种在每一步选择中都采取在当前状态下最好或最优(即最有利)的选择,从而希望导致结果是全局最好或最优的算法。原理:贪心算法通过局部最优选择来构造全局最优解。在每一步,算法都做出一个看起来最优的决策,期望通过局部最优达到全局......
  • c++SPFA细剖
    SPFA(ShortestPathFasterAlgorithm),作为一种高效的最短路算法,是Bellman-Ford算法的改进版本,结合了Dijkstra算法和Bellman-Ford算法的优点。下面我将从十个大的方面对SPFA算法进行详细剖析,每个大点下再分若干小点进行阐述。一、算法背景与起源1.1算法起源SPFA算法由西安交......
  • c++-类(中)
    c++-类(中)一、类的默认成员函数1.1什么是默认成员函数?1.2默认成员函数有哪些?二、构造函数2.1什么是构造函数?2.2构造函数的特点三、析构函数3.1什么是析构函数?3.2析构函数的特点四、拷贝构造函数4.1什么是拷贝构造函数?4.2拷贝构造函数的特点五、赋值运算符重载......
  • C++:强制类型转换速通
    强制类型转换核心为四个cast类型分别是:static_castdynamic_castconst_castreinterpret_cast补充:转换是否安全首先,派生类内一定有基类。基类指针可以指向派生类如果将指向基类的指针指向派生类,派生类对象在内存中的布局通常会以基类部分的开头,派生类可以看做是对基类......
  • C++:STL六大组件,知识点总结。
    STL知识点总结STL是C++标准库中的一个重要部分,提供了一组灵活通用的数据结构,核心是模板类。接下来是STL的主要组件及其功能简介。1.容器容器是用来存储和管理一组数据的对象。不同的容器适用于不同类型的数据存储需求。可理解为各种形式实现的存储结构顺序容器vec......
  • Qt/C++音视频开发81-采集本地麦克风/本地摄像头带麦克风/桌面采集和麦克风/本地设备和
    一、前言随着直播的兴起,采集本地摄像头和麦克风进行直播推流,也是一个刚需,最简单的做法是直接用ffmpeg命令行采集并推流,这种方式简单粗暴,但是不能实时预览画面,而且不方便加上一些特殊要求。之前就已经打通了音视频文件和视频流的采集,那是不是可以简单点的方式就能直接加入到原有的......
  • [底层原理] C/C++获取时间(将时间戳转换为年月日)?
    前言大家都知道,计算机中存储的时间是一个整数,在现在的编程语言中,可以很方便地将时间戳(整数)转换为字符串,但是如果没有这些我们该如何自己计算出呢?刚好以前研究过Nginx的源代码,我以他的代码为例,说明其背后的数学原理。当然在工程实践中,没有必要花时间自己实现转换的函数,所以本......
  • 【C++】类与对象篇三
    【C++】类与对象篇三一.运算符重载1运算符重载2赋值运算符重载3前置++和后置++重载4.const成员5.取地址及const取地址操作符重载一.运算符重载1运算符重载C++为了增强代码的可读性引入了运算符重载,运算符重载是具有特殊函数名的函数函数名字为:关键字o......