c ++ membre privé inconnue variable dans une autre fonction
-
26-10-2019 - |
Question
J'ai une question de débutant sur la façon d'attribuer membre de classe (compositeur). Je suis habitué à des scripts et la plupart du temps là, il est fait via (en python)
def set_mymember(mymember):
self.mymeber = mymember
Mon collègue m'a dit « moi » et « ce » ne sont pas nécessaires en C ++, « ce » existe et il n'a pas tort dans ce contexte, mais ce serait difficile à comprendre pour moi, donc il a dit que je ne devrais pas prendre soin. Donc, j'ai essayé selon son conseil:
Ma définition de la classe: - (il doit créer une chaîne de requête SQL)
class Query
{
public:
Query() { }
~Query() { }
void setoptions( std::string qtext_where="", bool qtext_erl=true, std::vector<std::string> kids=std::vector<std::string>() );
Query build_query( );
void set_db_table( std::string db_table );
void set_db_key( std::string db_key );
void set_m_qtext( std::string m_qtext );
void set_foo( std::string foo );
std::string sql();
std::string get_sql_update();
private:
std::string m_db_table; // Tabellenname
std::string m_db_key; // Tabellen-key
std::string m_qtext_where; // add.optionale where clause
std::string m_qtext; // fertiger SELECT
std::string m_sql_update; // fertiger UPDATE
bool m_erl; // nur erledigte waehlen?
std::vector<std::string> m_kids; // Liste von keys zu selecten
};
est ici l'une des méthodes setter: Je les appelle avec une ficelle et remplie vecteur, vérifiez dans ce code
void Query::setoptions( string qtext_where, bool erl, vector<string> kids ) {
m_qtext_where = qtext_where;
m_erl = erl;
m_kids = kids;
}
Mais quand mon application appelle plus tard query.build_query()
les variables sont vides
Query Query::build_query( ) {
cout << "kids size" << m_kids.size() << endl;
cout << "m_qtext_where " << m_qtext_where << endl;
// Query zur auswahl der zu uebertragenden Datensaetze
string sql_update = "UPDATE " + m_db_table;
string qtext = "SELECT * FROM " + m_db_table;
string qtext_order = " ORDER BY " + m_db_key;
(...)
EDIT : Voici donc la part de du code d'application qui appelle 1.setoptions et 2.build_query
// read file line by line into vector of strings
vector<string> text_file;
ifstream ifs( input );
string temp;
while( getline( ifs, temp ) ) {
if (temp.substr(0,1) == "#" ) {
cout << "COMMENT: " << temp << endl;
continue;
}
cout << temp << endl;
text_file.push_back( temp );
}
// check: yes, vector has a size = number of lines
cout << "text_file size " << text_file.size() << endl;
// create Query object
Query query = Query();
// set the members, bool erl = true
query.setoptions( "", erl, text_file );
// call 2nd method
q2 = query.build_query();
La solution
ne peut pas vraiment dire ce qui se passe sans le code complet, mais je suppose que vous retournez un objet de requête de query.build_query qui n'est pas une copie complète de l'objet de la requête, si cela fait sens? Pouvez-vous inclure le texte intégral de build_query?
En outre, je fais le vide de la méthode de build_query, et ne pas essayer d'assigner un objet de requête nouveau retour à un second objet de requête (q2) du tout (sauf si vous avez vraiment besoin, encore une fois, ne peut pas vraiment dire sans code complet), quelque chose comme ceci:
void Query::build_query( ) {
std::cout << "kids size" << m_kids.size() << std::endl;
std::cout << "m_qtext_where " << m_qtext_where << std::endl;
}
main
{
...
Query query = Query();
// set the members, bool erl = true
query.setoptions( "", true, text_file );
// call 2nd method
query.build_query();
}
En outre, juste être pédant, mais étant donné que vous fournissez args par défaut pour toutes les options, je serais enclin à les initialiser dans le constructeur comme ceci:
Query::Query()
: m_qtext_where("")
, qtext_erl(true)
, kids (std::vector<std::string>()
{}
Et puis au lieu d'une méthode setOptions, ont setters pour chaque variable:
void setWhere(std::string qtext_where) {m_qtext_where = qtext_where ;}
void setErl(bool query_erl) { m_erl = query_erl; }
void setKids(std::vector<std::string> kids) { m_kids = kids; }
que vous appelez uniquement lorsque vous devez ..