tôi có một cái số nguyên
Lớp này sẽ mô phỏng một số nguyên mod n. Do đó, nó có một hàm tạo như thế này:
Số nguyên::Số nguyên(int x)
: m(x), n(0)
{
}
Số nguyên::Số nguyên(int x, int y)
: n(y), m(x)
{
// nếu this->n lớn hơn 1
nếu (cái này->n > 1)
{
// mod cái này->m bằng cái này->n
cái này->m %= cái này->n;
// nếu this->m là số âm
nếu (cái này->m < 0)
{
// thêm cái này->n vào nó
cái này->m += cái này->n;
}
}
}
bên cạnh đóSố nguyên::nghịch đảo()
,Số nguyên::pow(int)
, cần thiết để hoàn thành câu hỏi này:
Số nguyên Số nguyên::inverse()
{
// Thuật toán Euclide mở rộng
int t = 0,
r = cái này->n,
mớiT = 1,
newR = cái này->m;
trong khi (newR != 0)
{
int thương = r/newR,
tSao chép = t,
rSao chép = r,
newTCopy = newT,
newRCopy = newR;
t = newT;
newT = tCopy - thương * newTCopy;
r = newR;
newR = rCopy - thương * newRCopy;
}
nếu (r > 1)
{
ném số nguyên(-1);
}
if (t < 0) t = t + this->n;
return Integer(t, this->n);
}
Số nguyên Số nguyên::bình phương()
{
return Integer(this->m * this->m, this->n);
}
Số nguyên Số nguyên::pow(int x)
{
// nếu x nhỏ hơn 0, trả về this->inverse().pow(-x)
if (x < 0) return this->inverse().pow(-x);
// nếu x là 0, trả về Integer(1)
if (x == 0) trả về Số nguyên(1, this->n);
// nếu x là 1, trả về *this
if (x == 1) return *this;
// nếu x là 2, trả về cái này->squared()
if (x == 2) trả về cái này->bình phương();
// nếu x lớn hơn 2
nếu(x>2)
{
// nếu x chẵn
nếu (x% 2 == 0)
{
// trả về cái này->pow(x/2).squared()
trả về cái này->pow(x/2).squared();
}
// return this->pow(x/2).squared() * (*this)
return this->pow(x/2).squared() * (*this);
}
}
Vấn đề tôi gặp phải là khi tôi đi thực hiện Số nguyên::isQuadraticResidue() const
giờ:
bool Integer::isQuadraticResidue() const
{
// nếu this->n bằng 0
nếu (cái này->n == 0)
{
// cái này không thuộc về Integers mod gì cả.
double baseSquareRoot = std::sqrt((double)this->m);
return (baseSquareRoot == (double)((int)baseSquareRoot));
}
// đây là thặng dư bậc hai iff this->pow((this->n + 1) / 2) == Integer(1, this->n)
return (this->pow((n + 1) / 2).m == 1);
}
Tôi nhận được lỗi sau:Lỗi: Truyền 'const Integer' làm tham số 'this' của 'Integer Integer::pow(int)' loại bỏ vòng loại
. Tôi nghĩ nó có liên quan đến sự kết thúc của hằng số
có liên quan. làm gì?
EDIT: Tệp tiêu đề lớp trông giống như:
#ifndefINTEGER_H
#defineINTEGER_H
#include
lớpSố nguyên
{
công cộng:
Số nguyên(int);
Số nguyên(int, int);
// hàm
Nghịch đảo số nguyên();
Bình phương số nguyên();
Số nguyên pow(int);
bool isQuadraticResidue() const;
Số nguyên sqrt();
riêng tư:
int m, n;
};
#endif
Đây là hằng số
vấn đề về tính đúng đắn, ở đâu hằng số
Hàm này đang cố gọi một cái gì đó khác ngoài hằng số
chức năng.
// ...
bool Integer::isQuadraticResidue() const;
Số nguyên Số nguyên::pow(int x);
// ....
trong trường hợp này,cái này
Đúngpow()
một trong nhữngSố nguyên*
,mộtconst Số nguyên*
hiện hữu isQuadraticResidue()
trong; điều này có nghĩa là pow()
Có thể được gọi isQuadraticResidue()
, bởi vì việc thêm vòng loại CV là hợp pháp, nhưng không phải ngược lại (vì pow()
sẽ phải chấp nhận cái này
như không giới hạn Số nguyên*
,thua hằng số
vòng loại).
Điều này không được phép vì cho phép nó có nghĩa là isQuadraticResidue()
phá vỡ sự đảm bảo rằng nó sẽ không sửa đổi thể hiện trực tiếp hoặc gián tiếp. Mặc dù nó không tự thay đổi trạng thái nhưng nó giả định pow()
Thực rathay đổi trạng thái vì pow()
Không hằng số
(Vì vậy không có gì đảm bảo không thay đổi trạng thái). Vì vậy,isQuadraticResidue()
Không thể gọi pow()
, vì làm như vậy có thể làm mất hiệu lực bảo hành của nó.
Với suy nghĩ này, có hai giải pháp cho vấn đề này.
- từ
isQuadraticResidue()
bị xóa khỏi hằng số
. Điều này sẽ giải quyết vấn đề một cách đơn giản nhưng không được khuyến khích vì khi đó bạn sẽ không nhận được hằng số
Lợi ích của sự đúng đắn.
Để lại tất cả không thay đổisố nguyên
Hàm thành viên của trạng thái logic cũng được đặt thànhhằng số
. Điều này sẽ đòi hỏi nhiều nỗ lực hơn nhưng nhìn chung sẽ an toàn hơn. bởi vì họ có thể const Số nguyên
Được kêu gọi, như trong số nguyên
giống như lệnh gọi ở trên, vì vậy bạn có thể chuyển phiên bản dưới dạng hằng< vượt qua
Cung cấp cho bạn mức độ bảo mật cao hơn bất cứ khi nào chúng không cần phải sửa đổi.
Số nguyên Số nguyên::inverse() const;
Số nguyên Số nguyên::bình phương() const;
Số nguyên Số nguyên::pow() const;
Điều này đòi hỏi phải thay đổi nguyên mẫu của hàm và định nghĩa của nó.
Tôi là một lập trình viên xuất sắc, rất giỏi!