C ++ Variable de miembro privado Desconocido en otra función
-
26-10-2019 - |
Pregunta
Tengo una pregunta de novato sobre cómo asignar miembro de clase (setter). Estoy acostumbrado a secuencias de comandos y, sobre todo, está hecho a través de (en Python)
def set_mymember(mymember):
self.mymeber = mymember
Mi compañero de trabajo me dijo que "yo" y "esto" no son necesarios en C ++ ", esto" existe y no está mal en este contexto, pero eso sería difícil de entender para mí, así que dijo que no debería importarme. Así que intenté por primera vez según su consejo:
Mi definición de clase: - (debería crear una cadena de consulta 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
};
Y aquí está uno de los métodos de Setter: los llamo con cadena llena y vector, verifíquelo en este código
void Query::setoptions( string qtext_where, bool erl, vector<string> kids ) {
m_qtext_where = qtext_where;
m_erl = erl;
m_kids = kids;
}
Pero cuando mi aplicación luego llama query.build_query()
Las variables están vacías
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;
(...)
EDITAR: Entonces, aquí está parte del código de la aplicación que llama 1.SetOptions, y 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();
Solución
Realmente no puedo decir qué está pasando sin el código completo, pero sospecho que está devolviendo un objeto de consulta de la consulta. ¿Puedes incluir el texto completo de Build_Query?
Además, haría que el método build_query nulo, y no intentaría asignar un objeto de consulta fresca a un segundo objeto de consulta (Q2) (a menos que realmente necesite, nuevamente, realmente no puede saber sin el código completo) , algo como esto:
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();
}
Además, solo siendo pedante aquí, pero dado que está proporcionando args predeterminados para todas las opciones, me inclinaría a inicializarlas en el constructor así:
Query::Query()
: m_qtext_where("")
, qtext_erl(true)
, kids (std::vector<std::string>()
{}
Y luego, en lugar de un método de setOptions, tienen setters para cada variable individual:
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 llamas solo cuando necesitas ...