妙用union和enum实现只有一个数据成员的类可存储不同的类型

直接上代码:

// From Thinking in C++, 2nd Edition
// Available at http://www.BruceEckel.com
// (c) Bruce Eckel 1999
// Copyright notice in Copyright.txt
// A super-variable
#include <iostream>
using namespace std;

class SuperVar {
	enum {
		character,
			integer,
			floating_point
	} vartype;  // Define one
	union {  // Anonymous union
		char c;
		int i;
		float f;
	};
public:
	SuperVar(char ch);
	SuperVar(int ii);
	SuperVar(float ff);
	void print();
};

SuperVar:: SuperVar(char ch) {
	vartype = character;
	c = ch;
}

SuperVar:: SuperVar(int ii) {
	vartype = integer;
	i = ii;
}

SuperVar:: SuperVar(float ff) {
	vartype = floating_point;
	f = ff;
}

void SuperVar::print() {
	switch (vartype) {
    case character:
		cout << "character: " << c << endl;
		break;
    case integer:
		cout << "integer: " << i << endl;
		break;
    case floating_point:
		cout << "float: " << f << endl;
		break;
	}
}

int main() {
	SuperVar A('c'), B(12), C(1.44F);
	A.print();
	B.print();
	C.print();
}



联合也可以有构造函数、析构函数、成员函数甚至访问控制,它与class的唯一不同之处在于存储数据的方式,观察如下代码:

// From Thinking in C++, 2nd Edition
// Available at http://www.BruceEckel.com
// (c) Bruce Eckel 1999
// Copyright notice in Copyright.txt
// Unions with constructors and member functions
#include<iostream>
using namespace std;

union U {
private: // Access control too!
	int i;
	float f;
public:  
	U(int a);
	U(float b);
	~U();
	int read_int();
	float read_float();
};

U::U(int a) { i = a; }

U::U(float b) { f = b;}

U::~U() { cout << "U::~U()\n"; }

int U::read_int() { return i; }

float U::read_float() { return f; }

int main() {
	U X(12), Y(1.9F);
	cout << X.read_int() << endl;
	cout << Y.read_float() << endl;
}


好的,我理解了。以下是解答: 首先,我们需要定义一个数据类型 datatype 来处理包含字符型、整型和浮点型三种类型数据。我们可以使用枚举类型 TYPE 来表示所处理的三种数据类型,以及一个联合体 union DATA 来储要处理的数据。 代码如下: ``` enum TYPE { INT, CHAR, FLOAT }; union DATA { int i; char c; float f; }; class datatype { private: TYPE type; // 储数据类型 DATA data; // 储数据 public: datatype(int i) { // 构造函数,接受整数类型数据 type = INT; data.i = i; } datatype(char c) { // 构造函数,接受字符类型数据 type = CHAR; data.c = c; } datatype(float f) { // 构造函数,接受浮点类型数据 type = FLOAT; data.f = f; } void show() { // 成员函数,输出数据类型数据 switch (type) { case INT: cout << "int " << data.i << endl; break; case CHAR: cout << "char " << data.c << endl; break; case FLOAT: cout << "float " << data.f << endl; break; } } }; ``` 在上面的代码中,构造函数分别接受整数、字符和浮点数类型数据,并分别将它们入联合体 DATA 的相应成员 i、c 和 f 中。成员函数 show() 用于输出数据类型数据。 现在,我们可以定义几个 datatype 的实例来处理输入数据,并输出结果了。假设输入的数据为 12 (int)、c (char) 和 23.45 (float),可以这样编写代码: ``` datatype data1(12); datatype data2('c'); datatype data3(23.45); data1.show(); data2.show(); data3.show(); ``` 运行上面的代码,输出的结果应该如下: ``` int 12 char c float 23.45 ``` 以上就是定义数据类型 datatype 并编写构造函数和成员函数 show() 的解答了。请问还有什么问题需要我帮忙解答吗?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值