打造国内最大的IC交易平台
技术资料 行业资讯 PDF资料 IC价格 IC替换 缩略语 IC供应 IC采购
Union的问题解答
类别:通信网络  
 
1、联合里面那些东西不能存放?

我们知道,联合里面的东西共享内存,所以静态、引用都不能用,因为他们不可能共享内存。

  2、类可以放入联合吗?

我们先看一个例子:

class TEST

{

public:

TEST():data(0) { }

private:

int data;

};

TYPEdef union _TEST

{

TEST TEST;

}UI;

  编译通不过,为什么呢?

  因为联合里不允许存放带有构造函数、析够函数、复制拷贝操作符等的类,因为他们共享内存,编译器无法保证这些对象不被破坏,也无法保证离开时调用析够函数。

  3、又是匿名惹的祸??

  我们先看下一段代码:

class TEST

{

public:

TEST(const CHAR* p);

TEST(int in);

const operator CHAR*() const {return data.ch;}

operator long() const {return data.l;}

private:

enum TYPE {Int, String };

union

{

const CHAR* ch;

int i;

}dataTYPE;

TYPE sTYPE;

TEST(TEST&);

TEST& operator=(const TEST&);

};

TEST::TEST(const CHAR *p):sTYPE(String),dataTYPE.ch(p) { }

TEST::TEST(int in):sTYPE(Int),dataTYPE.l(i) { }

  看出什么问题了吗?呵呵,编译通不过。为什么呢?难道dataTYPE.ch(p)和dataTYPE.l(i)有问题吗?

  在构造函数中当然要调用其成员的构造函数,所以其要去调用dataTYPE成员的构造函数,但是他没有构造函数可调用,所以出错。

  注意了,这里可并不是匿名联合!因为它后面紧跟了个data!

  4、如何有效的防止访问出错?

  使用联合可以节省内存空间,但是也有一定的风险:通过一个不适当的数据成员获取当前对象的值!例如上面的ch、i交错访问。

  为了防止这样的错误,我们必须定义一个额外的对象,来跟踪当前被存储在联合中的值得类型,我们称这个额外的对象为:union的判别式。

  一个比较好的经验是,在处理作为类成员的union对象时,为所有union数据类型提供一组访问函数。