后增量超载的冗余?

时间:2014-03-05 01:32:06

标签: c++ operator-overloading operators overloading

// The following operator++() represents overloading of pre-increment 
MyIncrDecrClass& operator++()  
{ 
    ++this->m_nCounter; 
    return *this; 
} 

// Passing dummy int argument is to mention overloading of post-increment  
MyIncrDecrClass& operator++(int)  
{ 
    this->m_nCounter++; 
    return *this; 
} 

所以这就是post和pre increment运算符的实现方式,但在我的情况下我不能真正实现它,所以这就是我所做的:

VLongInt& VLongInt::operator++()
{
    ... //BUILD TEMP vector
    this->vec = temp;
    return *this;
}

VLongInt& VLongInt::operator++(int)
{
    this->vec = this.vec; //seems unnecessary
    ... //BUILD TEMP vector
    this->vec = temp
    return *this;
}

有什么不对吗?似乎两者都应该以同样的方式实现。只有头文件应该不同,对吗?

2 个答案:

答案 0 :(得分:2)

你的后增量运算符重载的例子是错误的。

的Intsead
// Passing dummy int argument is to mention overloading of post-increment  
MyIncrDecrClass& operator++(int)  
{ 
    this->m_nCounter++; 
    return *this; 
} 

应该有

// Passing dummy int argument is to mention overloading of post-increment  
MyIncrDecrClass operator ++( int )  
{
    MyIncrDecrClass tmp( *this );

    ++this->m_nCounter; 

    return tmp; 
}

另外你的问题完全不清楚。你实际上定义了两次相同的算子

VLongInt& VLongInt::operator++()
{
    //...
    return *this;
}

VLongInt& VLongInt::operator++()
{
    //...
    return *this;
}

我没有看到差异。此外,您没有显示您的课程定义,结果没有任何关于您的问题的说法。这是未知的。

至少你自己说过你的postincrement运算符应该用int类型的伪参数声明。它必须返回一个临时对象。

VLongInt  VLongInt::operator ++( int )

const VLongInt  VLongInt::operator ++( int )

答案 1 :(得分:0)

  

有什么不对吗?

是的,您的代码违反了ODR(一个定义规则)。其在第3.2 / 1节中定义为:

  

任何翻译单元都不得包含任何变量,函数,类类型,枚举类型或模板的多个定义。

您应该改为定义这两个函数:

VLongInt& VLongInt::operator++();
const VLongInt VLongInt::operator++(int);

具体来说,请注意,后增量运算符应返回const TTT为您的类类型)。