c++ - 自增自减运算符重载

标签 c++ operator-overloading

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

Define a class named PrimeNumber that stores a prime number. The default constructor should set the prime number to 1. Add another constructor that allows the caller to set the prime number. Also, add a function to get the prime number. Finally, overload the prefix and postfix ++ and -- operators so they return a PrimeNumber object that is the next largest prime number (for ++) and the next smallest prime number (for --). For example, if the object's prime number is set to 13, then invoking ++ should return a PrimeNumber object whose prime number is set to 17. Create an appropriate test program for the class.

#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 在循环内没有改变。您的程序在最后一次输入后挂起,试图执行后缀 operator--

编辑

您的后缀运算符:

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) 相同:

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

关于c++ - 自增自减运算符重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32161008/

相关文章:

c# - 方法的类型签名与 PInvoke 不兼容

c++ - 单条件变量是否可以用于双向同步?

c++ - 如何使用结构作为条件的操作数?

c++ - 元多运算符重载

c++ - 如何测试引用是否为 NULL?

c++ - 错误 'a.out' : free(): invalid next size (normal)

python - 将 ctypes c_void_p 转换为 C 输出参数

c++ - 为 boost mpl 列表中的每种类型继承容器

c++ - 为什么不能在 C++ 中重载 '.' 运算符?

c++ - 如何重载赋值运算符以满足ob1=ob2=ob3(ob1、ob2、ob3是同一类的对象)