2010-10-06 30 views
6

Tôi có một lớp được gọi là AString. Nó là khá cơ bản:Làm thế nào để quá tải toán tử ==() cho một con trỏ đến lớp?

class AString 
{ 
public: 
    AString(const char *pSetString = NULL); 
    ~AString(); 
    bool operator==(const AString &pSetString); 
    ... 

protected: 
    char *pData; 
    int iDataSize; 
} 

Bây giờ tôi muốn viết mã như thế này:

AString *myString = new AString("foo"); 
if (myString == "bar") { 
    /* and so on... */ 
} 

Tuy nhiên, các nhà điều hành so sánh hiện tại chỉ hỗ trợ

if (*myString == "bar") 

Nếu tôi bỏ qua dấu đó, trình biên dịch không hài lòng.

Có cách nào để cho phép toán tử so sánh so sánh *AString với const char* không?

+4

Tại sao bạn phân bổ động 'myString'? Tại sao không phải là 'operator ==' một 'const' thành viên? Hay tốt hơn, tại sao nó lại là một thành viên? Hoặc thậm chí tốt hơn, tại sao bạn đang viết lớp chuỗi của riêng bạn? – sbi

+1

(1) Tôi không nên. Đó là một lỗi. (2) bạn có thể giải thích về điều đó không? (3) Tại sao nó không phải là một thành viên? (4) Bởi vì nền tảng đích là một hệ thống nhúng không có lớp chuỗi gốc. – bastibe

+0

2. Nếu bạn không làm cho nó const sau đó nó sẽ không làm việc cho const AString: s, 3. Bởi vì nó không cần phải là một thành viên và sẽ dẫn đến đóng gói tốt hơn, 4, những gì bạn có nghĩa là không có "chuỗi bản địa lớp học"? bạn có std :: string. – ronag

Trả lời

8

Không, không có.

Để quá tải operator==, bạn phải cung cấp loại do người dùng xác định là một trong các toán hạng và con trỏ (AString* hoặc const char*) không đủ điều kiện.
Và khi so sánh hai con trỏ, trình biên dịch có rất tích hợp sẵn trong operator==, do đó, nó sẽ không xem xét chuyển đổi một trong các đối số thành loại lớp.

2

[câu trả lời gốc đã sai và do đó hiệu chỉnh bên dưới]

Như đã chỉ ra bởi Oli Charlesworth, trong một bình luận dưới đây, điều này là không thể.

Bạn sẽ cần phải xác định một nhà điều hành như

bool operator==(const AString *as, const char *cs); // Note: C++ will not do that 

nhưng bạn không thể quá tải một nhà điều hành trừ khi một trong các thông số của nó là phi nguyên thủy loại - và con trỏ (cả con trỏ để AString và con trỏ đến char) là nguyên thủy loại.

+1

Nhưng làm điều này có thể dẫn đến những bất ngờ hơn nữa khi so sánh con trỏ sau đó! – Benoit

+2

Bạn không thể quá tải các toán tử trừ khi một trong số chúng là một kiểu không nguyên thủy. –

+0

... có nghĩa là "các thành viên không phải là thành viên". –

10

Không trừ khi bạn quấn nó trong một số loại lớp con trỏ thông minh, nhưng điều đó sẽ làm cho ngữ nghĩa kỳ quặc. Có gì sai với if (*myString == "bar")?

3

Tôi nghĩ điều bạn muốn là sai vì nó che khuất hệ thống kiểu của C++. myString a con trỏ đến AString và không phải là AString. Không cố che giấu sự thật rằng đó là một con trỏ. Đó là một điểm đầu vào cho các lỗi xấu xí và nếu bạn đang mã hóa trong một đội, mọi người khác sẽ chẳng là gì ngoài bối rối!

3
if (myString == "bar") 

ngay cả khi bạn làm cho nó hoạt động, rất khó hiểu cho người khác. Bạn đang so sánh một con trỏ với một đối tượng có chuỗi ký tự. Một cách rõ ràng hơn để có được công việc này là dereference con trỏ, và cung cấp một quá tải như

bool operator==(const char* pSetString); 
Các vấn đề liên quan