2011-12-26 26 views
11

Miễn là các vấn đề mới đang phát triển từ câu hỏi trước của tôi Overloaded assignment operator causes warning about recursion, tôi đã được yêu cầu hợp pháp để đăng bài này là câu hỏi mới. Tôi có một thành viên lớp tham chiếu trong lớp Player của tôi và tôi muốn triển khai hàm tạo bản sao và toán tử gán (=) của lớp này. Tôi phải đề cập rằng mục đích là hoạt động tốt của hàm vector.erase vì không có nó hoạt động đúng như tôi quan tâm. Tôi sử dụng một vector: vector allPlayers; Các thành viên của lớp Player là:Nhà điều hành chuyển nhượng với thành viên tham chiếu lớp

class Player 
{ 

    private: 
    int ID; 
    int pMoney; 
    int doubleIndicator; 
    int squarePosition; 
    Bank& bank; 
    string pName; 
    Square* capturedSquare; 
    multimap<string, PropertySquare*> squaresColBought; 
    multimap<string, House*> housesColBuilt; 

} 

Có bắt buộc phải tránh sử dụng tham chiếu làm thành viên lớp nếu tôi muốn triển khai toán tử gán? Điều gì về các thành viên bản đồ? Làm thế nào cuối cùng tôi nên thực hiện toán tử gán?

Một vấn đề khác quan trọng nhất mà tôi không biết là điều gì sẽ xảy ra với các đối tượng được chỉ định bởi các thành viên lớp con trỏ khi tôi xóa trình lặp của vectơ giữ Trình phát. Bất kỳ giúp đỡ?

+0

"Một vấn đề khác" => một câu hỏi khác cho người mới bắt đầu :) – xtofl

+0

Bạn muốn nhà điều hành chuyển nhượng làm gì với Ngân hàng? – fredoverflow

+0

FredOverflow: Chỉ cần sao chép ngân hàng vào đối tượng lhs – arjacsoh

Trả lời

7

Tôi sẽ không sử dụng thành viên tham chiếu khi bạn muốn một toán tử gán. Nếu bạn sử dụng (thông minh) con trỏ thay vào đó, bạn chỉ có thể làm

Player &operator=(Player const &other) 
{ 
    bankPtr = other.bankPtr; 
    // copy other members 
} 

Trong tình hình hiện nay, bank = other.bank sẽ sao chép nội dung của other.bank thay vì chỉ this->bank các nội dung tham chiếu bởi other.bank.

Đối với multimap thành viên được nhập, chúng có thể được sao chép mà không gặp sự cố, nhưng hãy nhớ rằng bạn sẽ nhận được bản sao khóa "sâu" (vì chúng thuộc loại string) nhưng "nông "con trỏ sao chép các giá trị, vì vậy bạn kết thúc với trạng thái chia sẻ. Bạn có thể muốn sử dụng shared_ptr cho các giá trị.

13

Một C++ 'tham khảo' chỉ có thể được khởi tạo, không được giao:

int value1(1), value2(2); 
int& ref1 = value1; // OK 
int& ref2; // compile error: reference not initialized 
int& ref3=ref1; // OK: ref3 refers to the same variable as ref1 
ref1=value2; // equivalent to 'value1=value2'. 

Chính vì vậy, một đối tượng chứa một tham chiếu chỉ có thể được khởi tạo, quá!

Vì vậy, thực sự: nếu bạn cần phân công trên một lớp, lớp đó không thể có biến thành viên tham chiếu. (Như là một vấn đề của thực tế, nó có thể, nhưng sự phân công không thể làm cho các thành viên tham khảo vị trí khác)

Khi bạn nghĩ về điều này, nó có ý nghĩa:

Khái niệm tham khảo định nghĩa 'bí danh' cho người khác biến. Bí danh ngụ ý rằng bất cứ điều gì bạn làm để bạn tham khảo, bạn thực sự làm đến vị trí được tham chiếu. Khi bạn áp dụng chuyển nhượng cho bí danh này, thực tế bạn chỉ định cho vị trí được tham chiếu. Mục đích của tham chiếu sẽ bị mất nếu bạn có thể làm cho nó trỏ đến một vị trí khác bằng cách sử dụng nhiệm vụ.

Nếu sau là thứ bạn cần, bạn nên sử dụng con trỏ.

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