Tôi xác định nhiều quá tải của các nhà điều hành phân như sau:Boolean và String quá tải của toán tử gán (C++)
foo.h
class Foo
{
private:
bool my_bool;
int my_int;
std::string my_string;
public:
Foo& operator= (bool value);
Foo& operator= (int value);
Foo& operator= (const std::string& value);
};
Foo.cpp
// Assignment Operators.
Foo& Foo::operator= (bool value) {my_bool = value; return *this;}
Foo& Foo::operator= (int value) {my_int = value; return *this;}
Foo& Foo::operator= (const std::string& value) {my_string = value; return *this;}
Và đây là main.cpp của tôi (xem nhận xét được đánh dấu SURPRISE
):
Foo boolFoo;
Foo intFoo;
Foo stringFoo;
// Reassign values via appropriate assignment operator.
boolFoo = true; // works...assigned as bool
intFoo = 42; // works...assigned as int
stringFoo = "i_am_a_string"; // SURPRISE...assigned as bool, not string
std::string s = "i_am_a_string";
stringFoo = s; // works...assigned as string
// works...but awkward
stringFoo = static_cast<std::string>("i_am_a_string");
Câu hỏi: Ai đó có thể cho tôi biết lý do tại sao một chuỗi ký tự không được hiển thị đang được đánh giá trong ngữ cảnh boolean?
@Mooing Duck: Tại sao xóa các nhà thầu? Tôi đã thêm chúng để cố tình chỉ ra rằng một biến có thể được *** khởi tạo thông qua một hàm tạo, và sau đó *** gán lại *** thông qua một toán tử gán. (Như tôi đã thấy trong các bài viết SO khác, đôi khi bạn cần *** cả ***.) – DavidRR
Tôi đã cắt mã vì [Câu hỏi hay có ví dụ ngắn gọn có thể biên dịch được] (http://sscce.org/) và [mã của bạn có thể ngắn hơn và đơn giản hơn và vẫn tái tạo vấn đề] (http://ideone.com/W2nemc). Lần đầu tiên tôi không đọc hầu hết câu hỏi của bạn, bởi vì nó có quá nhiều mã trong đó, và tôi đoán (chính xác) rằng hầu hết nó không liên quan đến câu hỏi của bạn. –
@Mooing Duck: Vâng, tôi rất đồng ý về nguyên tắc và đã xem xét điều này khi thêm các nhà thầu vào ví dụ của tôi. Nhưng tôi sẽ trì hoãn phán đoán của bạn ở đây. Tuy nhiên, hy vọng của tôi là bất cứ ai đi qua bình luận của tôi sẽ biết để xem xét các contructors liên quan là tốt. – DavidRR