Tôi đang gặp khó khăn trong việc đặt câu hỏi về những gì tôi đang cố hỏi để tôi cung cấp cho bạn một ví dụ:Cú pháp quá tải của toán tử cơ bản trong C++
Giả sử chúng tôi đang làm việc trên hệ thống 3D xác định một lớp vectơ, Vec3. Chúng ta quá tải một số toán tử số học cho các resons rõ ràng. Trong số này chúng ta quá tải toán tử * sao cho nó sẽ trả về dấu chấm của hai vectơ. Bây giờ mã của chúng tôi nên tìm một cái gì đó như thế này:
class Vec3{
private:
float x, y, z;
public:
float operator*(const Vec3&) const; //dot product
.
.
.
Bây giờ nói rằng chúng tôi muốn để có thể mở rộng vector của chúng tôi bằng cách sử dụng các nhà điều hành * với một cái gì đó, nói một phao. Điều này có thể được thực hiện bằng cách tuyên bố như sau:
Vec3 operator*(const float) const;
friend Vec3 operator*(const float, const Vec3&);
này yeilds hai quá tải và Tôi tự hỏi nếu có một cách để làm điều đó chỉ với một cú, tức là nói chúng ta khai báo này thay cho hai dòng trên:
friend Vec3 operator*(const Vec3&, const Vec3&);
và sau đó thêm giá trị mặc định cho Vec3 ctor để xử lý chuyển đổi từ phao.
ví dụ cuối cùng này sẽ làm việc cho:
Vec3 someVec3 = 1.0 * otherVec3; //through friend Vec3 operator*(const float, const Vec3&)
tuy nhiên không cho điều này:
Vec3 someVec3 = otherVec3 * 1.0;
như trình biên dịch sẽ không biết được của hai sử dụng:
friend Vec3 operator*(const float, const Vec3&); //the one we want to use
or
float operator*(const Vec3&) const; //the one for the dot product
Mọi đề xuất?
Cảm ơn bạn!
Có gì sai với hai lần quá tải? Khi bạn chỉ ra, một sự mơ hồ khá khó chịu được tạo ra khi bạn cố gắng đơn giản hóa nó ... –
Điều duy nhất tôi sẽ làm khác đi, là tạo ra cả hai phiên bản của vô hướng các hàm bạn bè thay vì một thành viên, để mã sẽ có cùng tính đối xứng với chính nó. –
Sẽ không hiệu quả khi xây dựng một véc tơ chỉ để vượt qua một phao. Đây sẽ là một thời gian chạy không hiệu quả nhưng một chức năng quá tải thêm có thể được inlined. – QuentinUK