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