2012-09-03 9 views
6

Objekt ich auf worm_sim simulater arbeite, ubuntu, gcc, Codeblöcke IDEFehler bei Zuordnung Mitglied im schreibgeschützten

traffic_source.h Datei

class Traffic_source : public Buffer_owner, public Connector, public Addressee{ 
private: 
    static unsigned int id_base; 
    unsigned int id; 
    unsigned int packet_size; 
    unsigned int flit_size; 
    double packet_generating_rate; 
    int pkt_id; 
    traffic_source_state ts_state; 
    double* packet_to_destination_rate; 
    Traffic_mode traffic_mode; 
    int period;    // period for packet generation using trace_file 
    ifstream trace_file; 
    int trace_file_loop_cnt; // how many times we have gone over the trace file so far 
    bool trace_file_empty; 
    ofstream trace_dump;  // trace file to dump out 

    typedef struct Message { 
     int timestamp; 
     unsigned int destination; 
     unsigned int size; 
    } Message, *pMessage; 

    Message pre_fetched_message; 
    bool get_next_message(Message & msg); 

    unsigned int get_destination_uniform(void) const; 
    unsigned int get_destination_transpose1(void) const; 
    unsigned int get_destination_transpose2(void) const; 
    unsigned int get_destination_hotspot(void) const; 
    unsigned int get_destination_customized(void) const; 

    void generate_a_packet(unsigned int dst_id); 
    void generate_packets(const Message & rec); 

public: 
    Traffic_source(Position p, int buf_sz); 
    ~Traffic_source(); 
    bool can_send(void) const; 
    bool can_receive(void) const { return false; } 
    bool send(void); 
    bool receive(class Flit * a_flit) { return false; } 
    class Connector * get_receiver(void) const; 

    static void reset_id_base(void) { id_base = 0; } 

    void tick(void); 

    /* traffic control routines */ 
    void set_packet_generating_rate(double r); 
    void set_packet_to_destination_rate(unsigned int dst_id, double rate); 
    double get_packet_to_destination_rate(unsigned int dst_id) const; 
    double get_total_packet_injection_rate(void) const; 
    int set_trace_file(char * file_name); 
    bool has_trace_file(void) { return (trace_file.is_open()); } 
    int get_id(void) const { return id; } 
}; 

traffic_source.cpp

Traffic_source::Traffic_source(Position p, int buf_sz) : Buffer_owner(buf_sz), Addressee(p) { 
    id = id_base ++; 
    packet_generating_rate = param.packet_generating_rate; 
    packet_size = param.flits_per_packet; 
    flit_size = param.flit_size; 
    traffic_mode = param.traffic_mode; 
    period = 0; 
    packet_to_destination_rate = 0; 
    pkt_id = 0; 
    ts_state = OFF_ 

    if (param.dump_traffic_source_trace) { 
     char file_name[20]; 
     sprintf(file_name, "%d.trace", id); 
     trace_dump.open(file_name); 
     if (!trace_dump.is_open() || !trace_dump.good()) { 
      cerr << "Error in opening file " << file_name << " for trace dumping" << endl; 
      exit(-1); 
     } 
     trace_dump << "PERIOD\t" << param.simulation_length << endl; 
     trace_dump << "#Trace file dumped by worm_sim from node " << id << endl; 
     trace_dump << "#Folloing lines are with format as:" << endl 
        << "#timestamp\t" << "destination\t" << "message_size(bits):" << endl; 
    } 
} 

bool Traffic_source::can_send(void) const 
{ 
    int router_id=get_id(); 
    unsigned int local_availability; 

    pRouter a_router= param.network->get_router(router_id); 
    local_availability=a_router->get_port_availability(0); 
    //cout<<local_availability<<endl; 
    if (buffer.is_empty()) 
     return false; 
    if(local_availability <= 0) 
    { 
     packet_generating_rate = 0; //error: assignment of member ‘Traffic_source::packet_generating_rate’ in read-only object| 
     set_packet_generating_rate(0); // error: passing ‘const Traffic_source’ as ‘this’ argument of ‘void Traffic_source::set_packet_generating_rate(double)’ discards qualifiers [-fpermissive]| 
     return false; 
    } 


    // This is somehow trick, we need to verify whether the first flit in the fifo 
    // is received right in this clock cycle. If so, we can not send it 
    const Flit * first_flit = buffer.peek_flit(); 
    if (first_flit->arrived_in_this_cycle()) 
     return false; 

    pConnector receiver = get_receiver(); 

    if (receiver) 
     return receiver->can_receive(); 
    else 
     return false; 
} 

der Wert packet_generating_rate ist nicht const, aber wenn ich versuche, es entweder direkt oder mit der Set-Funktion zu ändern, gibt es mir Fehler

packet_generating_rate = 0; //error: assignment of member  
‘Traffic_source::packet_generating_rate’ in read-only object| 

set_packet_generating_rate(0); // error: passing ‘const Traffic_source’ as ‘this’ argument of ‘void Traffic_source::set_packet_generating_rate(double)’ discards qualifiers [-fpermissive]| 

obwohl es auf anderen Dateien ohne Probleme verwendet wird, jede Anregung plz

Antwort

3
bool Traffic_source::can_send(void) const 

diese Erklärungen dreht this in einen Zeiger auf eine const. Durch das Markieren einer Methode wie const wird die Instanz unveränderlich, sodass Sie ihre Member nicht ändern können.

Warum haben Sie es als const an erster Stelle markiert, wenn Sie Mitglieder zu ändern?

Auch mir scheint es, dass can_send Getter Semantik hat, so logisch sollte es nicht Mitglieder ändern (Ich denke, hier ist der Fehler, dass Sie packet_generating_rate zu ändern versuchen, nicht die Methode machen const.

0

A const Member-Funktion wie diese

bool Traffic_source::can_send(void) const 

von modifizierenden alle Membervariablen dieser Klasse nicht zulässig ist. wie Sie eine Membervariable innerhalb dieser Funktion ändern, ist der Grund, warum Sie den Fehler. Stellen Sie die Funktion nicht konstanten und Ihren Willen bekomme diesen Fehler nicht

2
packet_generating_rate = 0; 

Es wird innerhalb einer konstanten Funktion verwendet. In der konstanten Funktion können Sie den Wert eines Datenelements des Objekts, auf dem die Funktion aufgerufen wurde, nicht ändern.

17
bool Traffic_source::can_send(void) const 

Wie andere bereits hingewiesen hat, ist das Problem, dass in einer const Funktion (letzte const in der Linie), die Sie nicht, die Mitglieder des Objekts ändern können. Effektiv wird die Elementfunktion in etwas ähnlich dem übersetzt: bool Traffic_source__can_send(const Traffic_source* this, void), dort ist das this Argument ein Zeiger auf const. Das bedeutet wiederum, dass packet_generating_rateconst im Kontext der Funktion ist.

Es gibt drei Alternativen, die Sie hier folgen:

  • nicht ändern das Mitglied
  • Sie markieren die Funktion const
  • packet_generating_rate machen mutable

der ersten Zwei Optionen sind die üblichen: entweder ist die Funktion const und ändert das Objekt nicht, oder es ist nicht const und kann das Objekt ändern. Es gibt jedoch Fälle, in denen Sie ändern möchten, um ein Element innerhalb eines const Mitgliedszeigers zu ändern. In diesem Fall können Sie die Elementdeklaration als mutable markieren, um die Änderung innerhalb von const Elementfunktionen zu ermöglichen.

Beachten Sie jedoch, dass dies im Allgemeinen geschieht, wenn die Elementvariable nicht an dem sichtbaren Zustand des Objekts teilnimmt. Zum Beispiel ändert eine mutex Variable nicht den von einem Getter zurückgegebenen Wert oder den Zustand des Objekts im Nachhinein, aber Getter müssen das Objekt sperren (modifizieren), um eine konsistente Ansicht des Objekts in Multithread-Umgebungen zu erhalten. Das zweite typische Beispiel ist ein Cache, in dem ein Objekt eine Operation anbieten kann, die teuer zu berechnen ist, so dass die Funktion, die diese Operation ausführt, das Ergebnis für später cache. Auch wenn der Wert neu berechnet oder aus dem Cache abgerufen wird, wird es gleich sein, so ändert sich der sichtbare Zustand des Objekts nicht. Schließlich müssen Sie manchmal das Konstrukt missbrauchen, um es einer vorhandenen Schnittstelle anzupassen.

Jetzt müssen Sie bestimmen, welche der drei Optionen auf Ihr Design angewendet werden soll. Wenn Sie das Elementattribut ändern müssen, ist entweder das Element Teil des sichtbaren Status und die Funktion sollte nicht const sein, oder es ist nicht Teil des Zustands des Objekts und kann als mutable markiert werden.

Verwandte Themen