Frage

Ich habe eine Neulingsfrage zur Zuweisung von Klassenmitglied (Setter). Ich bin es gewohnt zu Scripting und meistens da ist es über (in Python) gemacht

def set_mymember(mymember):
     self.mymeber = mymember

Mein Mitarbeiter sagte mir "Selbst" und "das" werden in C ++ nicht benötigt, "das" existiert und es ist in diesem Zusammenhang nicht falsch, aber das wäre für mich schwer zu verstehen, also sagte er, es sollte mich nicht interessieren. Also habe ich zuerst nach seinem Rat versucht:

Meine Klassendefinition: - (Es sollte eine SQL -Abfrage -Zeichenfolge erstellen)

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
};

Und hier ist eine der Setter -Methoden: Ich rufe sie mit gefüllter Zeichenfolge und Vektor auf, überprüfen Sie sie in diesem Code.

void Query::setoptions( string qtext_where, bool erl, vector<string> kids ) {
   m_qtext_where  = qtext_where;
   m_erl          = erl;
   m_kids = kids;     
}

Aber wenn meine App später anruft query.build_query()

Die Variablen sind leer

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;
   (...)

BEARBEITEN: Also hier ist ein Teil des App -Code, der 1.SetOptions und 2.build_query aufruft

       // 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();
War es hilfreich?

Lösung

Ich kann nicht wirklich sagen, was ohne den vollständigen Code los ist, aber ich vermute, dass Sie ein Abfragungsobjekt von query.build_query zurückgeben, das keine vollständige Kopie des Abfragungsobjekts ist, wenn das Sinn macht? Können Sie den vollständigen Text von Build_Query einfügen?

Außerdem würde ich die Build_Query -Methode ungültig machen und nicht versuchen, einem zweiten Abfrageobjekt (Q2) ein neues Abfrageobjekt zurückzugeben (es sei denn, Sie müssen es ohne den vollständigen Code wirklich nicht wirklich sagen) , etwas wie das:

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();
}

Wenn ich hier nur pedantisch bin, aber angesichts der Tatsache, dass Sie Standardargs für alle Optionen anbieten, würde ich sie im Konstruktor wie folgt initialisieren:

Query::Query() 
    : m_qtext_where("")
    , qtext_erl(true)
    , kids (std::vector<std::string>()
{}

Und dann haben Sie anstelle einer SetOptions -Methode Setzer für jede einzelne 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; }

was Sie nur anrufen, wenn Sie benötigen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top