需要解决限制:抽象类不能用于返回类型

时间:2015-07-17 00:10:57

标签: c++ abstract-class pimpl-idiom

我有一个C ++类,我希望使用pImpl指针隐藏它的实现。大部分工作已经完成,除了运营商之外,其他一切都没问题' + ='它返回同一个类的对象。该运算符函数必须在类中。问题在于,当构成一个抽象类时,没有任何成员函数可以返回该类的对象,因此' + ='是不允许的。

我正在寻求有关处理此限制的建议。我更喜欢一种不需要更改使用此类的现有代码的方法。如果这种方式不存在,还能做些什么呢?

这是我希望摘要的类的简化版本:

class AClass 
{
public:
    AClass( int x0, int y0);
    ~AClass(void);
    void operator=(const AClass &A2);
    AClass operator+(const AClass &A2);
    void operator+=(const AClass &A2);
protected;
    int x;
    int y;
};

AClass AClass::operator+(const AClass &A2) { AClass AOut(A2); AOut += A2;  return AOut; }
AClass AClass::operator+=(const AClass &A2) { this->x += A2.x; this->y += A2.y; } 


// 'operator+' is necessary to perform the following operation on AClass objects. i.e.
A = B + C;
// 'operator+=' is necessary to perform the following operation on AClass objects. i.e.
A += B;

1 个答案:

答案 0 :(得分:3)

  

EXCEPT用于运算符'+ =',它返回同一类的对象

$query = "INSERT IGNORE INTO table (id) VALUES (?)"; $doQuery = DB::insert($query, array($value)); if ($doQuery) { return DB::getPdo()->last(); } else { return 0; } (以及其他赋值运算符)需要返回operator+=而不是AClass&

参见例如Scott Meyers “Effective C ++” 第10项

  

让赋值运算符返回对AClass

的引用

这样可以避免按值返回类的问题,并使代码更接近C ++指南。

P.S。*this似乎不是唯一的一点。例如,operator+=具有相同的问题,不应返回引用。所以你可以认为这篇文章是问题的字面答案,但不是问题的解决方案。