【发布时间】:2015-08-22 21:34:44
【问题描述】:
这是我一直试图解决的问题:
定义一个名为 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
【问题讨论】:
-
请注意,看起来两个后缀运算符都没有返回正确的结果。
-
你能举个例子吗?不,我没有测试,但逻辑看起来不对。
-
你的后缀运算符都错了。它们应该返回对象的旧值,而不是新值加或减一。
-
我刚刚意识到@n.m。怎么解决?
-
如何修复后缀
hold问题?我已经编辑了我的问题@Wimmel