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

Cách trả về một hằng số từ hàm thành viên (thường) trả về một tham chiếu (đến dữ liệu thành viên)

In lại Tác giả: Taklimakan Thời gian cập nhật: 2023-11-03 07:39:00 31 4
mua khóa gpt4 Nike

Tôi đang làm việc trên ma trận tam giác dưới/trên (gấp đôi) Viết một lớp học. bằng cách sử dụng n*n Ma trận tam giác chỉ có n*(n + 1)/2 [có thể khác 0], nội bộ tôi chỉ lưu trữ số phần tử trong thành viên mảng phẳng.

Đầu tiên, tôi có một lớp cơ sở gồm các ma trận "bình thường" (tức là dày đặc), trong đó toán tử() Là một toán tử chỉ số dưới, nó lấy các chỉ mục hàng và cột:

lớp ma trận {
public:
// […]
const ảo double &operator()(unsigned i, unsigned j);
ảo kép &operator()(không dấu i, không dấu j);
// […]

private:
std::valarray data_;
std::size_t size_;
}

// […]
const double &Matrix::operator()(unsigned i, unsigned j) {
trả về dữ liệu_[size_*i + j];
}

Đối với ma trận tam giác (tôi sẽ sử dụng ma trận tam giác sau làm ví dụ), để cung cấp giao diện giống như ma trận thông thường, tôi cần triển khai một toán tử chỉ số dưới hơi khác một chút:

const double &LowerTriangular::operator()(unsigned i, unsigned j) const ghi đè {
trả về dữ liệu_[i*(i + 1)/2 + j];
}

Mặc dù toán tử trên chưa hoàn chỉnh vì nếu người ta yêu cầu một mục nhập ở bên phải đường chéo (nhưng vẫn nằm trong ma trận lý thuyết), thì một phần tử khác (không liên quan) sẽ được trả về, nhưng 0nên được trả lại.

Vì các tham chiếu không thể bị ràng buộc với các biến cục bộ nên tôi không thể chỉTrả về 0. Vì vậy, làm thế nào để tôi đạt được điều này?

Tôi chỉ có thể nghĩ về một biến tĩnh cục bộ:

const double &LowerTriangular::operator()(unsigned i, unsigned j) const ghi đè {
const tĩnh gấp đôi số 0 = 0;
nếu (j > i) trả về 0;
trả về dữ liệu_[i*(i + 1)/2 + j];
}

Tôi có thể yêu cầu hàm trả về theo giá trị, nhưng còn phiên bản không phải const (khi người gọi thực sự cần sửa đổi nội dung) thì sao? Làm thế nào để đảm bảo rằng người gọi không sửa đổi không Biến tĩnh? Điều này hoạt động, nhưng hơi xấu:

const double &LowerTriangular::operator()(unsigned i, unsigned j) const ghi đè {
tĩnh kép số 0 = 0;
if (j > i) return zero = 0 // hơi xấu nhưng vẫn hoạt động được
trả về dữ liệu_[i*(i + 1)/2 + j];
}

double &LowerTriangular::operator()(unsigned i, unsigned j) ghi đè {
return const_cast( const_cast(*this)(i, j) );
}

Vậy giải pháp tốt nhất là gì?

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

Tối ưu hóa bạn đã chọn xung đột với giao diện bạn cung cấp.

Một cách tiếp cận có thể là không trả về tham chiếu mà thay vào đó trả về một trình bao bọc trong suốt hoạt động giống như một tham chiếu. Tương tự như std::vector::::reference Nội dung. Một ví dụ:

Tham khảo cấu trúc {
phần tử kép*;

toán tử double() const {
phần tử trả về
?*yếu tố
: 0;
}
Tham chiếu& toán tử=(double d) {
nếu (phần tử!)
ném std::out_of_range("Không thể sửa đổi phía bên phải của chẩn đoán");
*phần tử = d;
return *this;
}
};

tham chiếu const
LowerTriangular::operator()(unsigned i, unsigned j) const {
return {
j>tôi
?nullptr
: dữ liệu_ + i*(i + 1)/2 + j
};
}

Thẩm quyền giải quyết
LowerTriangular::operator()(unsigned i, unsigned j) {
return {
j>tôi
?nullptr
: dữ liệu_ + i*(i + 1)/2 + j
};
}

Điều này có liên quan đến std::vector::::reference Có một lưu ý tương tự là việc lấy địa chỉ của tham chiếu sẽ không cung cấp cho bạn một con trỏ tới đối tượng kép. Đây có thể là sự quá tải nhà điều hành & một trong số ít trường hợp. Có ý nghĩa. Nhưng điều này cũng có thể phản trực giác khi người dùng API biết về trình bao bọc và thực sự muốn địa chỉ của trình bao bọc.

Bạn có thể chỉ định rằng các nỗ lực sửa đổi phía bên phải của đường chéo là hành vi không xác định thay vì ném.

Về c++ - cách trả về một hằng số từ hàm thành viên (thường) trả về một tham chiếu (đến dữ liệu thành viên), 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/55653109/

31 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