递增和递减运算符重载

这是我一直试图解决的问题:

定义一个名为PrimeNumber的类来存储质数。 默认构造函数应该将素数设置为1.添加另一个允许调用者设置素数的构造函数。 另外,添加一个函数来获取素数。 最后,重载前缀和后缀++-- operators以便它们返回PrimeNumber对象,该对象是下一个最大素数(用于++ )和下一个最小素数(用于-- )。 例如,如果对象的素数设置为13,则调用++应返回质数设置为17的PrimeNumber对象。为该类创建适当的测试程序。

#include <iostream>
#include <cstdlib>
using namespace std;

class PrimeNumber
{
public:
    PrimeNumber() : pNum(1) {}
    PrimeNumber(int setNum) : pNum(setNum) {}
    int getNum() const { return pNum; }
    PrimeNumber operator ++(); //prefix
    PrimeNumber operator ++(int ignoreMe); //postfix
    PrimeNumber operator --();
    PrimeNumber operator --(int ignoreMe);
    bool isPrime(const int& num);
private:
    int pNum;
};

int main( )
{
    int x;
    cout << "enter prime number => ";
    cin >> x;

    PrimeNumber p(x);
    PrimeNumber hold = p++;
    cout << "Value of hold => " << hold.getNum() << endl;
    cout << "Value of p => " << p.getNum() << endl;

    cout << "enter prime number => ";
    cin >> x;

    PrimeNumber p2(x);
    PrimeNumber hold2 = ++p2;
    cout << "Value of hold2 => " << hold2.getNum() << endl;
    cout << "Value of p2 => " << p2.getNum() << endl;

    cout << "enter prime number => ";
    cin >> x;

    PrimeNumber p3(x);
    PrimeNumber hold3 = p3--;
    cout << "Value of hold3 => " << hold3.getNum() << endl;
    cout << "Value of p3 => " << p3.getNum() << endl;

    cout << "enter prime number => ";
    cin >> x;

    PrimeNumber p4(x);
    PrimeNumber hold4 = --p4;
    cout << "Value of hold4 => " << hold4.getNum() << endl;
    cout << "Value of p4 => " << p4.getNum() << endl;


    return 0;
}
bool PrimeNumber::isPrime(const int& num)
{
    if (num < 2)
    {
        return false;
    }
    else if (num == 2)
    {
        return true;
    }
    else
    {
        for (int i = 2; i <= num / 2; i++)
        {
            if (num % i == 0)
            {
                return false;
            }
        }
    }
    return true;
}

PrimeNumber PrimeNumber::operator ++() //prefix
{
    pNum += 1;
    while (!isPrime(pNum))
    {
        pNum++;
    }
    return pNum;
}
PrimeNumber PrimeNumber::operator ++(int ignoreMe) //postfix
{
    int temp = pNum += 1;
    while (!isPrime(pNum))
    {
        temp = pNum;
        pNum++;
    }
    return temp;
}
PrimeNumber PrimeNumber::operator --() //prefix
{
    pNum -= 1;
    while (!isPrime(pNum))
    {
        pNum--;
    }
    return pNum;
}
PrimeNumber PrimeNumber::operator --(int ignoreMe) //postfix
{
    int temp = pNum -= 1;
    while (!isPrime(pNum))
    {
        temp = pNum;
        pNum--;
    }
    return temp;
}

该问题与减量运算符重载有关。 我认为增值经营者按预期工作。 如果不这样,请注明。 但是,对于后缀增量和减量操作, hold值似乎不像预期的那样。 如何解决这个问题。 此外,如果还有其他可纠正的错误,请注明。

Output                              Expected Output
----------                          -------------------
enter prime number => 11            enter prime number => 11
Value of hold => 12                 Value of hold => 11
Value of p => 13                    Value of p => 13
enter prime number => 11            enter prime number => 11
Value of hold2 => 13                Value of hold2 => 13
Value of p2 => 13                   Value of p2 => 13
enter prime number => 11            enter prime number => 11
Value of hold3 => 8                 Value of hold3 => 11
Value of p3 => 7                    Value of p3 => 7
enter prime number => 11            enter prime number => 11
Value of hold4 => 7                 Value of hold4 => 7
Value of p4 => 7                    Value of p4 => 7

PrimeNumber PrimeNumber::operator --(int ignoreMe) //postfix
{
    int temp = pNum -= 1;
    while (!isPrime(pNum))
    {
        temp = pNum;
        temp--;
    }
    return temp;
}

此代码将永久运行,导致pNum在循环内部不会更改。 你的程序在最后一次输入后挂起,试图执行postfix operator--

编辑

你的postfix操作符:

PrimeNumber PrimeNumber::operator --(int ignoreMe) //postfix
{
    int temp = pNum -= 1;
    while (!isPrime(pNum))
    {
        temp = pNum;
        pNum--;
    }
    return temp;
}

仍然无效。 这是正确的版本恕我直言:

PrimeNumber PrimeNumber::operator --(int ignoreMe) //postfix
{
    int temp = pNum;
    while (!isPrime(--pNum)) {}
    return temp;
}

操作oprator++(int)相同oprator++(int)

PrimeNumber PrimeNumber::operator ++(int ignoreMe) //postfix
{
    int temp = pNum;
    while (!isPrime(++pNum)) {}
    return temp;
}

所以你的代码有一些基本的问题。

  • 一般来说,我们希望前缀运算符返回自己的引用。
  • 通常你的返回值是调用一个不必要的隐式PrimeNumber构造函数。
  • 以下是您可以遵循的基本规则:

  • 前缀样式:根据需要执行递增或递减操作,然后返回*this

  • 后缀样式 :通过执行auto copy = *this创建自己的auto copy = *this ,然后调用适当的前缀运算符。

  • 让我们尝试实现这一点:

    PrimeNumber & PrimeNumber::operator ++() //prefix
    {
        pNum += 1;
        while (!isPrime(pNum))
            pNum++;
        return *this;
    }
    
    PrimeNumber PrimeNumber::operator ++(int ignoreMe) //postfix
    {
        auto copy = *this;
        ++(*this);
        return copy;
    }
    
    PrimeNumber & PrimeNumber::operator --() //prefix
    {
        pNum -= 1;
        while (!isPrime(pNum))
            pNum--;
        return *this;
    }
    
    PrimeNumber PrimeNumber::operator --(int ignoreMe) //postfix
    {
        auto copy = *this;
        --(*this);
        return copy;
    }
    

    另外,当测试代码给出错误的结果时,应该抛出断言等。 我不应该考虑考试是对还是错。

    int main( ) {
        auto x = PrimeNumber(17);
        auto hold = x++;
        assert(hold.getNum() == 17);
        assert(x.getNum() == 19);
    
        x = PrimeNumber(18);
        hold = x--;
        assert(hold.getNum() == 18);
        assert(x.getNum() == 17);
    
        x = PrimeNumber(25);
        hold = ++x;
        assert(hold.getNum() == 29);
        assert(x.getNum() == 29);
    
        x = PrimeNumber(19);
        hold = --x;
        assert(hold.getNum() == 17);
        assert(x.getNum() == 17);
    
        cout << "Success!n"
    }
    

    这个main()将只打印Success! 如果所有的断言都是真的。

    链接地址: http://www.djcxy.com/p/73149.html

    上一篇: increment and decrement operator overloading

    下一篇: Operator "<<" overloading return type