cuốn sách gpt4 ai đã làm

c++ - Lỗi: chuyển 'const Integer' làm đối số 'this' của 'Integer Integer::pow(int)' loại bỏ vòng loại

In lại Tác giả: Walker 123 Thời gian cập nhật: 28-11-2023 00:00:00 34 4
mua khóa gpt4 Nike

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

câu trả lời hay nhất

Đâ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.

  1. 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.
  2. Để 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ó.

Về c++ - Lỗi: chuyển 'const Integer' làm đối số 'this' của 'Integer Integer::pow(int)' loại bỏ vòng loại, chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/39886006/

34 4 0
Walker 123
Hồ sơ

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá taxi Didi miễn phí
Phiếu giảm giá taxi Didi
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress