2010-02-19 28 views
13

Tôi đang tái cấu trúc một số lượng lớn mã, trong đó tôi phải thêm tham số phụ vào một số hàm, sẽ luôn có giá trị của một thành viên của đối tượng đó. Một cái gì đó nhưThành viên không tĩnh làm tham số mặc định trong C++

class MyClass 
{ 
public: 
    CMyObject A,B; 

    void MyFunc(CMyObject &Object); 
    // used to be void MyFunc(); 
}; 

Bây giờ, tôi muốn thực sự thích nó để đọc

class MyClass 
{ 
public: 
    CMyObject A,B; 

    void MyFunc(CMyObject &Object = A); 
}; 

Nhưng tôi không được phép có một tham số mặc định đó là một thành viên không tĩnh. Tôi đã đọc this similar question cho thấy điều này là không thể, nhưng tôi tự hỏi nếu có bất kỳ cách giải quyết hợp lý nào. Lý do là 95% thời gian tham số mặc định sẽ được sử dụng, và do đó sử dụng tham số mặc định sẽ làm giảm đáng kể lượng mã tôi phải thay đổi. Giải pháp tốt nhất của tôi cho đến nay là một cái gì đó như thế này;

class MyClass 
{ 
public: 
    CMyObject A,B; 

    void MyFunc(BOOL IsA = TRUE); 
}; 

void MyClass::MyFunc(BOOL IsA) 
{ 
    CMyObject &Object = A; 
    if (!IsA) 
     Object = &B; 
} 

Điều này ít hơn rất nhiều, nhưng có cách nào tốt hơn để làm điều này mà tôi bị thiếu không?

Chỉnh sửa: FWIW, lý do cho thông số bổ sung là để bên ngoài một số thành viên liên quan đến tiểu bang từ đối tượng được đề cập để hỗ trợ đa luồng.

+0

Nếu thành viên có dữ liệu, theo định nghĩa, nó không phải là quốc tịch. –

+0

Điểm công bằng Neil, soạn thảo văn bản. –

Trả lời

18

Làm thế nào về:

class MyClass 
{ 
public: 
    CMyObject A,B; 

    void MyFunc() 
    { 
    MyFunc(A); 
    } 
    void MyFunc(CMyObject &Object); 
}; 

?

+0

Cảm ơn Benoit, tôi biết rằng phải có một cách tốt hơn. Nhìn chằm chằm vào màn hình quá lâu. –

+0

Bạn được chào đón. Lưu ý rằng quá tải không được phép trong C# và Java, và đây là cách để bù đắp. Vì vậy, tôi đoán tôi đã không phát minh ra bất cứ điều gì :-) –

+0

Tôi nghĩ rằng bạn có nghĩa là các tham số mặc định không được phép trong C# và Java - chúng chắc chắn cho phép quá tải (và các tham số mặc định rõ ràng là trong C# 4.0) –

4

Một cách khác:

class MyClass 
{ 
public: 
    MyObject A,B; 

    void MyFunc(MyObject MyClass::*myObject = &MyClass::A) { 
     MyObject& obj = *(this->*myObject); 
    } 
}; 

này làm cho nó thậm chí không thể vượt qua trong một thành viên MyObject từ một ví dụ MyClass. Ba tùy chọn hợp lệ của bạn để gọi MyFunc là .MyFunc(), .MyFunc(&MyClass::A).MyFunc(&MyClass::B)

Các vấn đề liên quan