2011-07-26 81 views
2

我有一個關於如何分配類成員(setter)的新手問題。我用的腳本,而且大多數情況它是通過(在python)進行C++私有成員變量在另一個函數中未知

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

和這裏的setter方法之一:我叫他們用填充字符串和矢量,仔細檢查它在這個代碼

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(); 
+1

您需要提供你怎麼稱呼setoptions。 – blottedscience

+0

在調用build_query之前是否先調用SetOptions? – Jeeva

+1

那麼,哪個私有成員變量在另一個函數中是未知的呢?這是另一個功能?此外,嘗試將德語翻譯成英語:) –

回答

2

真的不能告訴怎麼回事不完整的代碼,但我懷疑你是否從query.build_query返回了一個不是查詢對象完整副本的查詢對象,如果這有意義的話?你可以包含build_query的全文嗎?另外,我會讓build_query方法成爲void,並且不要試圖將一個新的Query對象重新分配給第二個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方法,每個setter方法個別變量:

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

你打電話,只有當你需要..

+0

感謝您的詳細解答。我同意在構造函數中設置默認值並使build_query無效,我想這樣做,但我的同事認爲返回另一個對象是個好主意。儘快編輯並重新寫入。 – groovehunter

+0

不幸的是該成員再次失去了它的價值... – groovehunter

+0

我的不好,我讓他們在二傳手裏面重新宣佈。 'bool m_erl = erl;' – groovehunter

相關問題