2014-12-03 2 views
0

Я пытаюсь написать модель для системы, используя SystemC (библиотека C++ для системного моделирования). Мой проект состоит из трех основных частей: a Server, a Environment, People объектов и Robots. Окружающей среде и серверу необходим доступ ко всем роботам в системе. Моя первоначальная идея состояла в том, чтобы сохранить вектор Robot объектов как в Server, так и в объектах Environment (которые будут переданы в конструкторы каждого). Однако для класса vector требуется, чтобы объект имел конструктор по умолчанию. По характеру SystemC «модули» не имеют конструкторов по умолчанию, так как каждый модуль должен иметь имя. Кроме того, мне нужно передать в вектор Robot. Общим решением для этого является использование вектора указателей, а затем инициализация вектора из конструктора, как показано на рисунке here. Однако модули Robot также должны принимать дополнительные параметры в своих конструкторах. Так что я не могу разыграть этот трюк. Я был бы признателен, если бы кто-нибудь мог предложить мне решение этой дилеммы.Работать вокруг для требования конструктора по умолчанию для вектора?

Для краткости я только отправлю код для Server и Robot, так как все модули страдают от одной и той же проблемы; если я могу зафиксировать его в одном месте, остальные должны следовать.

server.h

#ifndef SERVER_H_ 
#define SERVER_H_ 

#include <vector> 
#include <systemc.h> 

#include "Person.h" 
#include "Robot.h" 

SC_MODULE (Server) 
{ 
public: 
    sc_in<bool> clk; 

    SC_HAS_PROCESS(Server); 
    Server(sc_module_name name_, std::vector<Robot> robots); 

    void prc_server(); 
}; 

#endif /* SERVER_H_ */ 

server.cpp

#include "Server.h" 
Server::Server(sc_module_name name_, std::vector<Robot> robots) : sc_module(name_) 
{ 
    SC_METHOD(prc_server); 
    sensitive << clk.pos(); 
} 


void Server::prc_server() 
{ 

} 

robot.h

#ifndef ROBOT_H_ 
#define ROBOT_H_ 

#include <vector> 
#include <systemc.h> 

#define ROBOT_SPEED 0.1 

SC_MODULE (Robot) 
{ 
private: 
    std::vector<unsigned> path; 
public: 
    sc_in<bool> clk;   // system clock 
    sc_in<bool> canMove;  // true = safe to move 
    sc_in<unsigned> position; // current position 

    sc_out<bool> arrived;  // true = arrived at next position 

    SC_HAS_PROCESS(Robot); 
    Robot(sc_module_name name_, std::vector<unsigned> path); 

    void prc_robot(); 
}; 


#endif /* ROBOT_H_ */ 

robot.cpp

#include "Robot.h" 

Robot::Robot(sc_module_name name_, std::vector<unsigned> path) : sc_module(name_) 
{ 
    this->path = path; 

    SC_METHOD(prc_robot); 
    sensitive<<clk.pos(); 
} 

void Robot::prc_robot() 
{ 

} 

Here's the compiler output (я положил его на Pastebin, потому что опустошили количество символов)

+2

Я уверен, что вектор не требует конструктора по умолчанию, если вы не используете определенные элементы. –

+0

Ваш код отлично работает на моей машине: http://coliru.stacked-crooked.com/a/df9bf0d388dda1a8 Пожалуйста, прочтите эту страницу, а затем отредактируйте вопрос: http://stackoverflow.com/help/mcve –

+0

@MooingDuck Interesting; он не будет компилироваться здесь (я использую C++ 11). Это дает мне ошибку «в этом контексте» в начале конструктора «Робот». – audiFanatic

ответ

2

окружающей среды и сервер как нужен доступ для всех роботов в система , Моя первоначальная идея состояла в том, чтобы сохранить вектор объектов Robot в и Объекты Server и Environment (которые будут переданы в конструкторы каждого).

Согласно вашему заявлению, ваша оригинальная идея (и фрагмент кодов, которые вы показываете) приведет к тому, что все роботы вашей среды будут дублированы, так как каждый сервер и среда будут хранить КОПИЮ вашего вектора.

Этого не хотят, если вы хотите добавить код, чтобы мучительно синхронизировать повторяющиеся роботы в каждом объекте.

Таким образом, вам лучше управлять общим вектором роботов и передавать его при построении в вашу систему/среду/и т. Д. ПО ССЫЛКЕ. Тогда у вас будет только один единственный и последовательный вектор роботов. Если он обновляется в одном месте, все остальные объекты также будут видеть обновление.

Теперь вектор не требует установки по умолчанию.Это зависит от операций, которые вы делаете:

vector<Robot> robots;  // legal: empty vector, not a single robot constructed 
//vector<Robot> robts(10); // ilegal: requires default constructor to initializethe 10 elements 
robots.push_back(a);   // legal: a robot was created, it is now copied into the vector 
robots.reserve(10);   // legal: space is allocated for 10 reobots, but no robot is actually constructed. 
robots.resize(10);   // illegal: space is allocated and robots are created to 

Таким образом, вы могли бы perfecly хорошо создать пустой вектор, и заполнить ее по мере необходимости, construcing каждого робота в отдельности со всеми необходимыми параметрами.