2011-07-26 12 views
2

私は、クラスメンバー(セッター)を割り当てる方法について初心者の質問があります。私は、スクリプトを使用していますし、ほとんどがそれは(Pythonで)を介して行われますC++プライベートメンバーの変数が別の関数で不明

def set_mymember(mymember): 
    self.mymeber = mymember 

は、私の同僚は、「自己」教えてくれましたし、「これは」、C++で必要とされていない「これは」存在し、それはこの文脈では間違っていないのですしかし、それは私のために理解するのが難しいだろうので、彼は私が気にしてはいけないと言った。だから私は、最初に彼のアドバイスに従ってみました:

私のクラス定義: - :私は塗りつぶされた文字列とベクターとそれらを呼び出すここ

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

とセッターメソッドの一つだが(これは、SQLクエリ文字列を作成する必要があります) 、ダブルは、このコード

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

EDIT:だからここ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(); 
+1

...のみ呼び出す

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

。 – blottedscience

+0

build_queryを呼び出す前にSetOptionsを最初に呼び出しましたか? – Jeeva

+1

他の関数では、どのprivateメンバー変数が不明ですか?もう一つの機能は何ですか?また、ドイツ語を英語に翻訳しようとしました:) –

答えて

2

が本当に完全なコードなしで起こっていただきまし言うが、私はできません。クエリオブジェクトの完全なコピーではないquery.build_queryからクエリオブジェクトを返すと思われます。あなたはbuild_queryの全文を含めることができますか?

また、build_queryメソッドを無効にして、新しいQueryオブジェクトを2番目のQueryオブジェクト(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(); 
} 

また、ちょうどここに知識をひけらかすことができますが、すべてのオプションのデフォルト引数を提供していることを考えると、私はこのようなコンストラクタでそれらを初期化するために傾斜させることだろう:

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

そして、setOptionsメソッドの代わりに、それぞれにセッター個々の変数:必要なときにあなたが関数setoptionsを呼んだ方法を提供する必要が

+0

あなたの精巧な答えに感謝します。私はコンストラクタのデフォルトを設定し、build_query voidを作ることに同意します、私はそうしたかったのですが、私の同僚は別のオブジェクトを返すと思っていました。できるだけ早く編集して書きます。 – groovehunter

+0

残念ながら、メンバーは再びその価値を失った... – groovehunter

+0

私の悪い、私は彼らがセッターの中に再宣言した。 'bool m_erl = erl;' – groovehunter

関連する問題