Erreur dans l'attribution de membre en lecture seule de l'objet
Je suis en train de travailler sur worm_sim simulater , ubuntu, gcc, IDE codeblocks
traffic_source.h fichier
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;
}
la valeur packet_generating_rate n'est pas const mais quand j'ai essayer de la modifier, soit directement ou à l'aide de la fonction de jeu il me donner les erreurs
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]|
bien qu'il est utilisé sur d'autres fichiers sans problème, une suggestion plz
OriginalL'auteur user1643699 | 2012-09-03
Vous devez vous connecter pour publier un commentaire.
Comme d'autres l'ont déjà souligné, le problème est qu'à l'intérieur d'un
const
fonction (dernièreconst
dans la ligne) vous ne pouvez pas modifier les membres de l'objet. Effectivement la fonction de membre est traduit en quelque chose de similaire à:bool Traffic_source__can_send( const Traffic_source* this, void )
, il y a lathis
argument est un pointeur versconst
. Ce qui signifie quepacket_generating_rate
estconst
dans le contexte de la fonction.Il y a trois alternatives que vous pouvez suivre ici:
const
packet_generating_rate
mutable
Les deux premières options sont les plus courantes: soit la fonction est
const
et ne pas modifier l'objet, ou il n'est pasconst
et peut modifier l'objet. Il y a des cas, cependant, où vous voulez pour modifier un membre au sein d'unconst
pointeur de membre. Dans ce cas, vous pouvez marquer la déclaration d'un membre commemutable
pour permettre la modification à l'intérieur deconst
des fonctions de membre du.Toutefois, de noter qu'en général, cela se fait lorsque la variable de membre ne participe pas à la visible état de l'objet. Par exemple, un
mutex
variable ne change pas la valeur renvoyée par un getter ou de l'état de l'objet par la suite, mais getters besoin de verrouiller (modifier) l'objet pour obtenir une vue cohérente de l'objet dans les environnements multithreads. Le deuxième exemple typique est un cache, où un objet peut offrir à une opération qui coûte cher à calculer, de sorte que la fonction de l'exécution de cette opération pourrait cache la suite pour plus tard. Encore une fois, si la valeur est recalculée ou récupérées à partir de la cache ce sera la même chose, de sorte que le visible de l'état de l'objet ne change pas. Enfin, parfois, vous pourriez avoir besoin à l'abus de la construction de se conformer à une interface existante.Maintenant c'est à vous de déterminer laquelle des trois options à appliquer à votre conception. Si vous avez besoin de modifier l'attribut de membre, le membre est de la partie visible de l'état et de la fonction ne doit pas être
const
, ou autre chose, elle ne fait pas partie de l'état de l'objet et peut être marquémutable
.OriginalL'auteur David Rodríguez - dribeas
cette déclarations tourne
this
dans un pointeur vers unconst
. Marquage d'une méthode commeconst
rend l'instance immuable, de sorte que vous ne pouvez pas modifier ses membres.Pourquoi avez-vous marquer comme
const
en premier lieu, si vous allez modifier des membres?Aussi, il me semble que
can_send
a getter de la sémantique, donc, logiquement, il ne devrait pas modifier les membres (je pense que l'erreur ici est que vous essayez de modifierpacket_generating_rate
, ne pas faire la méthodeconst
.OriginalL'auteur Luchian Grigore
Il est utilisé à l'intérieur d'une fonction constante. Dans la fonction constante, vous ne pouvez pas modifier la valeur de toutes les données membres de l'objet sur lequel la fonction a été appelée.
OriginalL'auteur Coding Mash
Const fonction membre comme ce
est pas autorisé de modifier toutes les variables membres de la classe. Lorsque vous modifiez une variable membre à l'intérieur de cette fonction, c'est pourquoi vous obtenez le message d'erreur. La fonction non-const et de votre volonté de ne pas obtenir cette erreur.
OriginalL'auteur mathematician1975