2011-10-10 73 views
2

对象,我有以下结构:矢量包含引用

struct Transaction { 
    Transaction(Book& bb, Patron& pp, Date dd) 
     : b(bb), p(pp), d(dd) { } 
     Book& b; 
     Patron& p 
     Date d; 
}; 

当我试图把Transaction类型的对象为vector<Transaction>v_tpush_back,它不会工作。一个错误的屏幕丢失。

是因为我有引用作为我的对象的成员?

+1

您可以显示您用于将对象推入向量中的代码以及错误吗? – Jason

+0

我使用v_t.push_back()。 – Robotron

+0

引用引入到C++中以支持传递引用。他们从未打算被用作数据成员。尽管有一些*有效的用例,但使用指针作为数据成员而不是引用几乎总是更好。 – fredoverflow

回答

2

STL是基于价值的,并且与参考文献不兼容。你可以进入a horrible tangle试图绕过这条规则。

b的,pd构件转动成值或shared_ptr秒。

0

STL不能与引用一起工作,因为您不能拥有将分配引用(不是复制)的赋值运算符。
你应该使用指针,而不是像:

struct Transaction { 
    Transaction(Book& bb, Patron& pp, Date dd) 
     : b(&bb), p(&pp), d(dd) { } 
     Book* b; 
     Patron* p 
     Date d; 
}; 
+0

这就是我所做的,但我仍然想知道为什么当我涉及参考时它不起作用。 – Robotron

+1

@ user987827:它不起作用,因为C++标准库序列容器必须具有赋值运算符。您没有指定赋值运算符,因此编译器试图为您创建它。它不能这样做,因为*你不能改变参考*。将参考数据成员'Book & b;'想象为与常量指针“Book * const b;”非常相似,也不能更改const成员。 –

0

社区维基,因为这几乎可以肯定将调用UB。

如果你有一个拷贝构造函数,你可以使用新的布局使得赋值运算符:

struct Transaction { 
    Transaction(Book& bb, Patron& pp, Date dd) 
    : b(bb), p(pp), d(dd) { } 

    Transaction(const Transaction & src) 
    : b(src.b), p(src.p), d(src.d) { } 

    Transaction & operator= (const Transaction & src) { 
    if (this != &src) { 
     this->~Transaction(); 
     Foo * copy = new (this) Transaction(src); 
     return *copy; 
    } else { 
     return *this; 
    } 
    } 

    Book& b; 
    Patron& p 
    Date d; 

}; 

这可能与您的计算机的工作,你的编译器,具有特定的优化设置。然后,它可能不会。或者当您的操作员系统自动更新C++ ABI库时,它可能突然停止工作。或者,当您将它交付给客户时,它会突然停止工作,而客户的C++ ABI库的版本略有不同。

无论你如何切割它,更改引用都是未定义的行为。