2

我有一个关于如何分配班级成员(二传手)的新手问题。我习惯于编写脚本,主要是通过(在 python 中)完成

def set_mymember(mymember):
     self.mymeber = mymember

我的同事告诉我“self”和“this”在 C++ 中是不需要的,“this”存在并且在这种情况下并没有错,但这对我来说很难理解,所以他说我不应该关心。所以我首先按照他的建议进行了尝试:

我的类定义:-(它应该创建一个 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();
4

1 回答 1

2

如果没有完整的代码,我无法真正说出发生了什么,但我怀疑你从 query.build_query 返回的查询对象不是查询对象的完整副本,如果这有意义的话?能否包含 build_query 的全文?

另外,我会使 build_query 方法无效,并且根本不会尝试将新的 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 方法,为每个单独的变量设置设置器:

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

仅在需要时才调用..

于 2011-07-26T06:46:11.970 回答