我有一个模板类Triple的实现,它是一个容纳任意三种类型的容器。我的问题是,我的类将三个const引用作为参数值,并且值必须是私有的(定义),但是,我还必须实现copy-constructor和重载赋值运算符。
template <typename T1, typename T2, typename T3>
class Triple
{
public:
Triple()
{ }
Triple(const T1 &a, const T2 &b, const T3 &c) : a(a), b(b), c(c)
{ }
// copy constructor
Triple(const Triple &triple) {
a = triple.first();
b = triple.second();
c = triple.third();
}
// assignment operator
Triple &operator=(const Triple& other) {
//Check for self-assignment
if (this == &other)
return *this;
a = other.first();
b = other.second();
c = other.third();
return *this;
}
private:
T1 const& a;
T2 const& b;
T3 const& c;
};
如何在不分配const变量的情况下实现copy-constructor和赋值运算符?
答案 0 :(得分:5)
您可能不应该将const引用作为成员,因为您不能(通常)知道对象的生命周期将超过对象的生命周期,a
,b
和{{1}几乎肯定应该是c
类型,而不是Tx
。
如果您做知道这一点(确保您这样做,除非您是专家C ++开发人员,否则您更不可能理解其含义),那么您可以拥有一个复制构造函数使用初始化列表。
Tx const&
你不能拥有赋值运算符,因为赋值给引用改变了引用的对象而不是引用,你可以用指针模拟引用但是因为我认为这不是你想要的,我不会把它拼出来。
无论如何, 你应该做的 正在使用Triple(const Triple& other) {
: a(other.a)
, b(other.b)
, c(other.c)
{ }
而不是重新发明轮子。