2012-01-14 128 views
5

我有一个叫Location类,我需要一个CARRAY添加到其成员变量。此更改导致需要重载赋值运算符。C++重载赋值运算符

有没有办法复制所有之前我做了变化,正在复制这一类类型的变量,只需添加额外的代码复制CARRAY不单独复制每一个成员变量?

Location& Location::operator=(const Location &rhs) 
{ 
    // Only do assignment if RHS is a different object from this. 
    if (this != &rhs) 
    { 
     //Copy CArray 
     m_LocationsToSkip.Copy(rhs.m_LocationsToSkip); 

     //Copy rest of member variables 
     //I'd prefer not to do the following 
     var1 = rhs.var1; 
     var2 = rhs.var2; 
     //etc 
    } 

    return *this; 
} 
+0

所以,你想,实际上,调用编译器生成的赋值运算符? 'CArray'是否有一个赋值操作符? – 2012-01-14 23:46:18

+0

它有一个拷贝构造函数,但没有赋值操作符。我不确定我是否可以调用编译器生成的赋值运算符,因为我已经添加了一个CArray成员变量。 – 2012-01-14 23:49:38

+2

不,你不能调用产生的编译器之一,因为它不会产生任何更多的时候你提供一个(不是因为你增加了一个CARRAY成员,唯一改变的事情是,编译器生成一个对你的类不能调用一个用于CArray,因为它不存在)。恐怕没有办法做到这一点。 – 2012-01-14 23:51:08

回答

4

是,排序的。使用一种自身重载operator=的类型,因此您不必在包含类中进行此操作。即使在编写MFC代码时,我仍然主要使用std::vectorstd::string等,而不是MFC集合和字符串类。有时候你用CString卡住了,但我不记得上次用CArray而不是std::vector

+0

我认为这是最接近我需要的。不幸的是,应用程序的其余部分使用mfc容器,我讨厌将其改为使用stl容器。不过,这是一个很好的解决方案。谢谢。 – 2012-01-15 00:18:11

0

不,你不能。 最好的方法是使用脚本来生成真实的代码。

0

这通常是什么所谓的“复制和交换成语”来完成。你实现了一个复制构造函数和一个交换成员值的方法,最重要的是指向外部数据的指针。随着你的赋值运算符是这样的:

C& C::operator=(const C& c) { 
    C tmp(c); 
    this->swap(tmp); 
    return *this; 
} 

你甚至都不需要这样的自我分配后卫。

+0

但现在你必须枚举你的'swap'实现中的所有成员。这只是解决问题,并不能解决问题。 – 2012-01-15 03:16:06

+0

嗯,我在这里没有看到问题。太多价值会员?将它们打包在一个结构中,如果你打算少打字,就做一个分配。 – 2012-01-15 06:14:24

2

是。我通常做的是将所有东西都放在类中的成员结构中,除了不可复制的东西。就像这样:

class Location 
{ 
    struct Members 
    { 
     int var1, var2; 
    }; 

    Members m; 
    CArray m_LocationsToSkip; 

public: 
    Location& operator=(Location const& rhs); 
}; 

Location& Location::operator=(const Location &rhs) 
{ 
    // Only do assignment if RHS is a different object from this. 
    if (this != &rhs) 
    { 
     //Copy CArray 
     m_LocationsToSkip.Copy(rhs.m_LocationsToSkip); 

     //Copy rest of member variables 
     m = rhs.m; //will use Members automatically generated operator= 
        //which should do the correct thing because you only put 
        //normally copyable members in m 
    } 

    return *this; 
} 

我第一次发布有关这位这里:https://stackoverflow.com/questions/469696/what-is-your-most-useful-c-c-utility/1609496#1609496

+0

这似乎是一个体面的解决方案,但是需要对应用程序的其余部分进行相当多的重构来支持这一点。 – 2012-01-15 15:20:22

+0

@Cole W:怎么这样?你的成员是公开的,并且在应用程序中随处可见?在这种情况下,另一种选择是创建一个资源管理类来包含CArray(有些时候比例子比较),所以您可能只有一个可能需要重构的成员(可能不取决于它如何使用)。我在结构中使用了这个例子,因为这就是我的代码所需要的(它是指针,而不是数组,而智能指针不是我需要的),但在你的情况下,为CArray创建一个资源管理类可能会是一个更好的选择。 – n1ckp 2012-01-15 16:38:45