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();
¿Fue útil?

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 ...

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top