質問

クラスメンバー(セッター)を割り当てる方法について初心者の質問があります。私はスクリプトに慣れていますが、ほとんどがそれが行われています(Python)

def set_mymember(mymember):
     self.mymeber = mymember

私の同僚は私に「自己」と「これ」はC ++では必要ではない、これは「この文脈では間違っていない」と言ったが、それは私にとっては理解しにくいので、彼は気にするべきではないと言った。だから私は彼のアドバイスに従って最初に試しました:

私のクラス定義: - (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
};

そして、これがセッターの方法の1つです:私はそれらを塗りつぶされた文字列とベクトルでそれらを呼び出します、このコードでそれをダブルチェックします

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

しかし、私のアプリが後で電話をかけるとき query.build_query()

変数は空です

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

編集: :したがって、1.setoptionsと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();
役に立ちましたか?

解決

完全なコードなしで何が起こっているのか本当にわかりませんが、Query.build_Queryからクエリオブジェクトを返しているのではないかと疑っています。 build_queryの全文を含めることはできますか?

また、build_queryメソッドを無効にし、新鮮なクエリオブジェクトを2番目のクエリオブジェクト(q2)に割り当てようとしないようにします(実際に必要な場合がない限り、完全なコードなしでは実際にはわかりません) 、 このようなもの:

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

また、ここではPedanticであるだけですが、すべてのオプションに対してデフォルトのargを提供していることを考えると、私はこのようなコンストラクターでそれらを初期化する傾向があります。

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

そして、setoptionsメソッドの代わりに、個々の変数ごとにセッターがあります。

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

必要なときにのみ呼び出します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top