2013-06-12 28 views
6

Đây là câu hỏi về cách triển khai một số nhu cầu tôi đã có gần đây. Tôi chắc chắn có một mô hình hoặc giải pháp phổ biến cho điều này và, mặc dù tôi đã đi kèm với một, tôi mong muốn tìm hiểu thêm.Phương pháp C++ trong các lớp dẫn xuất với các tham số khác nhau

Giả sử tôi đang làm việc trong một trò chơi mà tất cả các thực thể liên quan đến bản thân trò chơi đều bắt nguồn từ lớp "Diễn viên" (nói "chướng ngại vật", "chướng ngại vật", "đạn" và "pháo"). Trong trò chơi, tất cả các thực thể đó được lưu trữ trong một véc tơ std::vector<Actor *> để chúng có thể được duyệt qua.

Bây giờ, giả sử mỗi "diễn viên" có thể "làm" một cái gì đó ở mỗi lượt và chúng ta hãy cung cấp cho họ một phương pháp "hành động". Chướng ngại vật :: hành động sẽ làm ít, Moving_obstacle :: hành động và đạn :: hành động sẽ di chuyển chúng xung quanh và "Cannon :: hành động" sẽ tạo ra một viên đạn mới. Nó có ý nghĩa để có một chức năng ảo thuần túy Actor :: hành động vì vậy tôi có thể lần lượt làm một cái gì đó như:

std::vector<Actor *>::iterator b=myvectorofactors.begin(), e=myvectorofactors.end(); 
while(b < e) 
{ 
    *b->act(); 
    b++; 
} 

Và có tất cả "hành động". Vâng, cho đến nay rất tốt ... Điều này, Cannon :: hành động có thể có một nguyên mẫu khác nhau hoặc giá trị trả lại (ví dụ, để lưu trữ một projectile và leter tạo ra nó đã đẩy vào vector) và sự khác biệt "nhỏ" này phá vỡ tất cả.

Bây giờ, tôi biết rằng từ quan điểm nhất định, các quá tải phương thức này là các chức năng hoàn toàn khác nhau. Tôi cũng biết rằng người ta luôn có thể lập kế hoạch trước và kỹ sư thông qua vấn đề với đủ tầm nhìn xa ... Hoặc người ta chỉ có thể xoay quanh vấn đề.

Trong trường hợp này, tôi chỉ sử dụng các trình nhận dạng duy nhất khác nhau cho mỗi lớp Actor có nguồn gốc và sử dụng chúng để đúc lớp phóng viên và thực hiện công việc xung quanh chúng. Tôi chắc chắn tôi sẽ gặp lại vấn đề tương tự và tôi tò mò muốn biết về một số giải pháp cấp nhập cảnh.

Cảm ơn trước về thời gian của bạn.

+0

ít bức tường của văn bản, nhiều ví dụ mã, xin vui lòng – David

+3

có thể không đồng ý @ Dave, đó là một cái giếng nghĩ ra câu hỏi. – Nick

+0

Bạn có thể muốn xem [Mẫu khách truy cập] (http://en.wikipedia.org/wiki/Visitor_pattern). – Nick

Trả lời

3

Sự bắt đầu là âm thanh, bạn có trật bánh ở đây:

có điều là, Cannon :: hành động có thể có một nguyên mẫu khác nhau hoặc giá trị trả về (ví dụ, để lưu trữ một viên đạn và leter tạo ra nó đã đẩy nó vào trong vector)

Tại sao lại như vậy? Hành động là hành động. Ví dụ phải tìm ra nó mà không cần gì khác. Bạn sẽ đào tạo nó trong ctor, hoặc các cuộc gọi khác trước khi hành động. Hoặc nó sẽ nhìn xung quanh trong cuộc gọi Hành động.

Hãy xem xét: ngay cả khi bạn kỳ diệu có tải trọng cho các thông số khác nhau đã sẵn sàng, trong báo giá trong khi làm thế nào nó sẽ được tìm ra? Cuộc gọi là trừu tượng. Ngay cả khi bạn bị nhiễm nó bởi một số dynamic_cast, vẫn còn rời khỏi vấn đề mà pháo sẽ nhận được params nào?

Không, các đối tượng phải hợp tác với nhau, hoặc sử dụng một số hệ thống tin nhắn (xem điều phối) ...

+0

Hệ thống nhắn tin chỉ là những gì tôi đã sử dụng trong một dự án khác. Kết thúc lên quá phức tạp - có lẽ là việc thực hiện tồi tệ - vì vậy tôi đã đi và thử một cái gì đó khác ... Tôi nhận thấy sự dồn dập (rất nhiều, mỗi khi tôi nhìn vào mã) nhưng không bao giờ nghĩ về việc đào tạo nó theo một phương pháp khác. Sẽ cung cấp cho nó một số suy nghĩ trong các dự án trong tương lai. Cảm ơn. –

+0

Được đánh dấu là câu trả lời. Không phải là bất kỳ bình luận đã được vô ích nhưng "Hành động là hành động" bit thực sự đã cho tôi. Chỉ cần FYI tôi tháo dỡ toàn bộ thừa kế bị lỗi và viết các phương thức khác nhau trong bộ điều khiển trò chơi và các lớp con diễn viên để làm việc với từng trường hợp cụ thể (quay, di chuyển các diễn viên khác xung quanh hoặc bất kỳ thứ gì khác). Việc xử lý giữa các lớp bằng phương thức whats_my_type_id là xấu, nhưng đủ xa cho dự án này. –

1

các biến nội bộ mà nội dung của từng hành động khác nhau và có thể sử dụng biến nội bộ/được thừa kế riêng, vì vậy nếu bạn có thể đặt các biến này trước khi gọi hành động, vì vậy bạn không cần gửi bất kỳ thông tin nào tham số để được an toàn, hoặc không nhận được trong các biến chứng

+0

Cảm ơn bạn đã trả lời ... Thing là, hãy tưởng tượng tôi muốn thêm một "đạn" mới: Vâng, tôi nên trả lại từ đâu đó hoặc chuyển một tham chiếu/con trỏ cho tôi để viết ... Tôi cho rằng mình có thể làm nó không có vấn đề nhưng sau đó một lần nữa, tôi sẽ kết thúc static_casting lớp "Diễn viên" để tôi có thể gọi những phương pháp chuẩn bị này. Bất kỳ ý tưởng về điều đó? –

+0

bạn có thể có tất cả hành động từ lớp cơ sở với tham số con trỏ, chỉ được sử dụng bởi các cá thể quan tâm và gửi một số không, cho những người không cần gửi lại bất cứ điều gì, – aah134

+0

Đó là những gì tôi thực sự có trong lớp "Pháo" của mình. Nó sẽ viết trên con trỏ khi thành công bắn và sau đó bộ điều khiển chính sẽ kiểm tra nếu một cái gì đó trong con trỏ đó để nó có thể được chèn vào vector Actor ... Tuy nhiên, tôi cần nhiều loại tham số hơn. Rất may tôi đã giải quyết nó: xem bình luận ở trên. –

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