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

C++: Làm cách nào để ngăn vectơ bị phá hủy sau khi trả về từ phương thức?

In lại Tác giả: Taklimakan Thời gian cập nhật: 2023-11-03 08:21:22 25 4
mua khóa gpt4 Nike

我正在尝试为 đa thức Toán tử chia quá tải lớp /, nhưng bản thân thuật toán không liên quan. Vấn đề là C++ dường như đang làm hỏng các đa thức của tôi khi tôi cố gắng trả lại chúng vì một lý do không xác định nào đó.

Đây là phần có liên quan của lớp:

lớpĐa thức
{
public:
........
Đa thức &operator/(const double &) const;
private:
int ĐỘ;
std::vector poly_terms // lưu trữ các hệ số đa thức;
........
}

Đây là cách tôi không thể làm cho nó hoạt động:

Đa thức &Đa thức::operator/(const double &rhs) const
{
Kết quả đa thức(10); //tạo đối tượng đa thức mới với bậc tối đa là 10
bộ đệm đôi;

for(int i = 0; i <= DEGREE; i++)
{
buffer = poly_terms[i]; //poly_terms có kiểu vector
result.setCoeff(i, buffer / rhs); //phương thức này gán (buffer / rhs) cho chỉ mục thứ i của thành viên dữ liệu vectơ của kết quả.
}
trả về kết quả; //trả về thể hiện đa thức
}

Ngay đó trở lại Trước khi mệnh đề được thực thi, trình gỡ lỗi sẽ hiển thị kết quả Tất cả các thành viên dữ liệu của đối tượng đều có giá trị được đặt chính xác như thuật toán sẽ đặt chúng, bao gồm vectơ Các thành viên dữ liệu Vì vậy, trong trở lại trước khi trở về,kết quả được xây dựng chính xác 100%, vì vậy tính logic của phương pháp này có vẻ ổn cho đến nay.

Nhưng trong trở lại Sau khi câu lệnh được thực thi, mọi thứ đều thất bại. Vì lý do nào đó, đối tượng được trả về có vectơ Thành viên dữ liệu đã thay đổi thành trống vectơ (Thật kỳ lạ, tất cả các thành viên dữ liệu khác không phải là đối tượng, chẳng hạn như BẰNG CẤP , giữ nguyên). Tôi không chắc liệu đó có phải là cùng một đối tượng vectơ bị làm trống bằng cách nào đó hay đó là một bản sao không thành công của đối tượng đa thức chứa đối tượng vectơ này.

Có ai biết tại sao điều này xảy ra và làm thế nào để tránh nó?

Cập nhật 1:Tôi nên đề cập rằng tôi cũng đã thử sử dụng new Được tạo theo phương pháp này đa thức sự vật. Tôi cũng đã thử bằng cách loại bỏ & để không trả lại một tài liệu tham khảo, vì vậy một cái gì đó như Đa thức Đa thức::operator/(const double &rhs) const tiêu đề. Nhưng cả hai đều đúng vectơ Các thành viên dữ liệu có tác động xấu tương tự.

更新 2:Nhờ những người đã đề cập rằng tôi không nên trả lại tài liệu tham khảo, tôi dường như đã tìm ra được vấn đề. Vấn đề nằm ở sự cần thiết phải quá tải hàm tạo bản sao và quá tải toán tử gán để thực hiện sao chép thủ công các thành viên dữ liệu vectơ (không chắc cả hai có cần thiết hay không, tôi chỉ thực hiện cả ba điều và bây giờ nó hoạt động hoàn hảo. Cảm ơn mọi người vì). sự giúp đỡ Giải quyết vấn đề này.

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

Vâng, bạn trả về một tham chiếu đến một biến cục bộ. Bất kỳ mã nào sử dụng biến này sẽ có hành vi không xác định. Có một giải pháp đơn giản cho trường hợp của bạn: xóa &

// Lưu ý rằng hàm không trả về tham chiếu nữa
Đa thức Đa thức::operator/(const double &rhs) const
{
Kết quả đa thức(10); //tạo đối tượng đa thức mới với bậc tối đa là 10
bộ đệm đôi;

for(int i = 0; i <= DEGREE; i++)
{
buffer = poly_terms[i]; //poly_terms có kiểu vector
result.setCoeff(i, buffer / rhs); //phương thức này gán (buffer / rhs) cho chỉ mục thứ i của thành viên dữ liệu vectơ của kết quả.
}
kết quả trả về//trả về đa thức
}

Bạn có thể nghĩ rằng nó sẽ làm chậm mã của bạn vì nó sao chép các biến kết quả. Điều này là sai. Mã của bạn sẽ sử dụng bản sao bỏ phiếu. Điều này có nghĩa là không có sự sao chép từ câu lệnh return.

Ngay cả khi trình biên dịch của bạn không hoạt động và không sử dụng phép sao chép bản sao, nó sẽ sử dụng hàm tạo di chuyển của lớp của bạn và nó vẫn sẽ nhanh hơn nhiều so với việc sao chép.

Để đọc thêm về sao chép bầu cử, hãy xem trang tài liệu tại đây:Loại bỏ bản sao

Giới thiệu về C++: Làm cách nào để tránh vectơ bị phá hủy sau khi trả về từ một phương thức? , 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/39859880/

25 4 0
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