закрытая переменная-член c ++, неизвестная в другой функции - PullRequest
2 голосов
/ 26 июля 2011

У меня есть вопрос новичка о том, как назначить члена класса (сеттер).Я привык к написанию сценариев, и в основном там это делается через (в 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
};

И вот один из методов установки: я вызываю их с помощьюзаполненная строка и вектор, дважды проверьте его в этом коде

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 Ответ

2 голосов
/ 26 июля 2011

Не могу точно сказать, что происходит без полного кода, но я подозреваю, что вы возвращаете объект запроса из 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; }

, которую вы вызываететолько когда нужно ..

...