2012-06-11 33 views
12

Tôi đã chuyển đổi một nền tảng mô phỏng khoa học từ Java sang C++. Tôi đã cố gắng giữ thiết kế càng nhiều càng tốt giống như thực hiện trước đó. Trong java vì các ràng buộc trễ, phụ thuộc vòng tròn được giải quyết tại thời gian chạy. Tuy nhiên, phụ thuộc vòng tròn đã tạo ra một đống lộn xộn trong C++.C++, hai lớp có nhu cầu chung

  1. Có công cụ tự động phân tích và liệt kê thông tin bao gồm và tham chiếu không? (Visual Studio 2010 chỉ phát hành một danh sách rất lớn các lỗi vô nghĩa).

  2. Tôi đã cố gắng sử dụng các tham chiếu chuyển tiếp bất cứ khi nào có thể. Tuy nhiên trong một số trường hợp cả hai lớp đều cần chức năng của lớp khác (tức là gọi đến các phương pháp khiến không thể sử dụng tham chiếu chuyển tiếp). Những nhu cầu này tồn tại trong Logic và nếu tôi thay đổi hoàn toàn thiết kế, chúng sẽ không đại diện cho tương tác thế giới thực.

    Làm cách nào chúng tôi có thể triển khai hai lớp cần phương pháp và trạng thái của nhau? Có thể triển khai chúng trong C++ không?

Ví dụ:

  • Ví dụ 1: Tôi có một lớp được gọi là "thế giới" mà tạo ra các đối tượng của các loại "chất độc". Đại lý cần gọi các phương thức của Thế giới để lấy thông tin về môi trường của nó. Thế giới cũng cần phải lặp qua các Đại lý và thực hiện phương thức "chạy" của họ và nhận được trạng thái của họ (cập nhật trạng thái có thể được thực hiện ngược lại để giải quyết phần này của vấn đề nhưng không phải là phương thức chạy).
  • Ví dụ 2: Đại lý tạo bộ sưu tập "Ý định" của họ. Mỗi tác nhân cần lặp lại thông qua ý định của nó và chạy/cập nhật/đọc trạng thái ý định. Ý định cũng cần để có được thông tin về môi trường thông qua Đại lý (nếu được thực hiện trực tiếp thông qua "Thế giới" nó sẽ tạo ra các vòng tròn phức tạp một lần nữa) và cũng có thể thông tin về bản thân Đại lý.

Dưới biểu đồ cho thấy một nhóm phụ khác của lớp học, và một số phương pháp và tài sản của họ:

sub-set of classes, and some of their methods and properties

+0

Nếu bạn gặp vấn đề với lỗi, bạn luôn có thể đăng câu hỏi chứa các lỗi đó (vui lòng nguyên văn) và ai đó rất có thể sẽ giúp bạn. Ngoài ra, những lỗi đó có thể vô nghĩa đối với bạn, nhưng không phải với người khác. Nó cũng rất khó để trả lời câu hỏi mà không nhìn thấy một số mã, và cho điều này tôi khuyên bạn nên đọc http://sscce.org/. –

+0

Joachim, Chúng là loại lỗi được tạo ra trong các trường hợp phụ thuộc vòng tròn. Không thể xác định các lớp học. 'code' 1> e: \ programming \ cprojt \ actiondb11 \ actiondb \ base \ world.h (35): lỗi C2143: lỗi cú pháp: thiếu ',' trước '*' 1> e: \ programming \ cprojt \ actiondb11 \ actiondb \ base \ world.h (36): lỗi C2061: lỗi cú pháp: định danh 'Agent' 1> e: \ programming \ cprojt \ actiondb11 \ actiondb \ base \ world.h (50): lỗi C2065: ' Tác nhân ': số nhận dạng không khai báo – wmac

+1

Đăng mã hữu ích hơn nhiều so với việc đăng lỗi. Đăng * cả * là tốt nhất. –

Trả lời

17

Tôi không thấy các khai báo chuyển tiếp không hoạt động cho bạn. Có vẻ như bạn cần một cái gì đó như:

World.h:

#ifndef World_h 
#define World_h 

class Agent; 

class World 
{ 
    World(); 
    void AddAgent(Agent* agent) { agents.push_back(agent); } 
    void RunAgents(); 
private: 
    std::vector<Agent*> agents; 
}; 

#endif 

Agent.h:

#ifndef Agent_h 
#define Agent_h 

class World; 
class Intention; 

class Agent 
{ 
    Agent(World& world_): world(world_) { world.AddAgent(this); } 
    status_t Run(); 
private: 
    World& world; 
    std::vector<Intention*> intentions; 
}; 

#endif 

World.cc:

#include "World.h" 
#include "Agent.h" 

void World::RunAgents() 
{ 
    for(std::vector<Agent*>::iterator i = agents.begin(); i != agents.end; ++i) 
    { 
     Agent& agent(**i); 
     status_t stat = agent.Run(); 
     // do something with stat. 
    } 
} 

// ... 

Agent.cc:

#include "Agent.h" 
#include "World.h" 
#include "Intention.h" 

// ... 
+1

Tôi sẽ thử lại các tham chiếu lần nữa với các tệp bao gồm ở đầu tệp cpp. tôi đoán rằng hy vọng sẽ giải quyết vấn đề. – wmac

+3

Mặc dù ngôn ngữ không yêu cầu, thực hành tốt là đưa tất cả các phần mềm vào đầu tệp để ai đó đọc mã của bạn có thể nhanh chóng biết được các phụ thuộc của nó. –

+1

Có giải pháp nào nếu bạn không chỉ có tài liệu tham khảo mà còn là trường hợp thực tế của loại A trong Loại B và ngược lại? Tôi nhận được một lỗi "loại không đầy đủ" từ trình biên dịch, điều này có ý nghĩa. Nhưng có cách nào xung quanh nó không? –

3

Bạn thể giải quyết vấn đề chỉ với tờ khai phía trước, nhưng có thể bạn didn' t riêng biệt việc thực hiện từ việc khai báo lớp.

Nếu bạn cần gọi các phương thức từ lớp học, cần có một loại đầy đủ, đó là lý do tại sao bạn cần phải bao gồm tệp. Bạn có thể đưa tệp vào một tệp cpp (tệp triển khai) mà không phải lo lắng về các phụ thuộc vòng tròn.

+0

Cảm ơn Luchian. Việc triển khai của tôi là riêng biệt nhưng tôi không di chuyển bao gồm các tệp cpp cùng với các tham chiếu chuyển tiếp. – wmac

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