聯合體類有使用者自定義型別的處理辦法
阿新 • • 發佈:2019-01-26
聯合體內部如果有使用者自定義成員,那麼各種型別建構函式,拷貝函式,解構函式,均被定義為刪除的。所以使用者需要肩負起構造,析構的責任。採用如下例所示的方法!!!!
#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; }