联合体类有用户自定义类型的处理办法

联合体内部如果有用户自定义成员,那么各种类型构造函数,拷贝函数,析构函数,均被定义为删除的。所以用户需要肩负起构造,析构的责任。采用如下例所示的方法!!!! 

#include<iostream>
#include<string>
using namespace std;
class Token
{
private:
	union
	{
		int i;
		double d;
		char c;
		string s;
	};
	enum
	{
		INT , DOUBLE , CHAR , STRING
	}tok;
	void copyToken(const Token &);
public:
	Token & operator=(const string &);
	Token & operator=(const int &);
	Token & operator=(const double &);
	Token & operator=(const char &);
	Token & operator=(const Token &);
	Token(const Token &);
	Token() :tok(INT), i(0) {}
	~Token();
};
void Token::copyToken(const Token & t)
{
	switch (tok)
	{
	case INT:
		i = t.i;
		break;
	case DOUBLE:
		d = t.d;
		break;
	case CHAR:
		c = t.c;
		break;
	case STRING:
		new(&s) string(t.s);
		break;
	}
}
Token & Token::operator=(const string &_s)
{
	if (tok == STRING)
		s = _s;
	else
	{
		new(&s) string(_s);
		tok = STRING;
	}
	return *this;
}
Token & Token::operator=(const int & _i)
{
	if (tok == STRING)
		s.~string();
	tok = INT;
	i = _i;
	return *this;
}
Token & Token::operator=(const double &_d)
{
	if (tok == STRING)
		s.~string();
	tok = DOUBLE;
	d = _d;
	return *this;
}
Token & Token::operator=(const char & _c)
{
	if (tok == STRING)
		s.~string();
	tok = CHAR;
	c = _c;
	return *this;
}
Token & Token::operator=(const Token & t)
{
	switch (t.tok)
	{
	case INT:
		*this = t.i;
		break;
	case DOUBLE:
		*this = t.d;
		break;
	case CHAR:
		*this = t.c;
		break;
	case STRING:
		*this = t.s;
		break;
	}
	return *this;
}
Token::Token(const Token & t) :tok(t.tok)
{
	copyToken(t);
}
Token::~Token()
{
	if (tok == STRING)
		s.~string();
}
int main()
{
	Token t;
	t = string("sasa");

	system("pause");
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41657315/article/details/81168970