c++
  • libpqxx
  • 2015-05-22 6 views 0 likes 
    0

    Я хотел бы передать глобальную переменную некоторые внешние параметры.входные параметры в файле C++ для глобальной переменной

    Мой фактический код:

    static const char conn_str[] = 
        "user='postgres' password='' host='127.0.0.1' port='5432' dbname='database'"; 
    
        pqxx::connection C(conn_str); 
        pqxx::nontransaction N(C); 
    

    И я хотел бы, чтобы иметь возможность кормить код с параметрами ARGV и до сих пор используют соединение C в качестве глобального.

    Любые мысли? заранее спасибо ...

    изменение:

    //I initialized 
        static const char conn_str[][150]=""; 
    
        pqxx::connection* C(conn_str); 
        pqxx::nontransaction* N(C); 
    
        int main(int argc, char* argv[]) 
        { 
    
        // code (....) 
    
        database=argv[4]; 
        char data[]="dbname=%s user=postgres hostaddr=127.0.0.1 port=5432"; 
        sprintf(conn_str,database); 
        C = new pqxx::connection(conn_str); 
        N = new pqxx::nontransaction (C); 
    
        OpenPSQL(); 
        LoadHeader(); 
        LoadCustomers(); 
        LoadProducts(); 
        LoadTaxes(); 
    
        // code 
    
        delete C; //dont forget to delete it when you are done 
        delete N; //dont forget to delete it when you are done 
        } 
    

    я получил такие ошибки:

    main.cpp: In function ‘void OpenPSQL()’:

    main.cpp:268: error: request for member ‘is_open’ in ‘C’, which is of non-class type ‘pqxx::connection*’

    ответ

    0

    Используйте указатели что-то вроде этого:

    static const char conn_str[]; 
    pqxx::connection* C; 
    
    int main(int argc, char** argv) 
    { 
        //... feed conn_str with argv here 
        C = new pqxx::connection(conn_str); 
        //... do whatever needs to be done 
        delete C; //dont forget to delete it when you are done 
    } 
    
    +0

    Зачем использовать необработанные указатели? –

    +0

    Приятный подход, я сделал это, и что-то не работает нормально. –

    +0

    измените эту строку на следующую, указав указатель так: N = new pqxx :: nontransaction (* C); – Sinapse

    0

    Вы изменили C от объекта к указателю, поэтому вам нужно будет изменить доступ к члену с C.whatever до C->whatever, если вы действительно хотите воспользоваться этим подходом. Компилятор жалуется, что вы применяете . вместо -> к указателю.

    Лучшим подходом было бы переместить сами переменные в main и передать их по ссылке на то, какие функции им нужны. Затем их жизнь автоматически управляется, и зависимости хорошо видны. Глобальные переменные почти никогда не являются хорошей идеей.

    Кроме того, используйте std::string вместо буфера фиксированного размера, поэтому вы не получите переполнение, если аргумент командной строки слишком длинный.

    +0

    Большое вам спасибо! Я вижу, что есть длинный путь, чтобы сделать этот код более надежным. –

     Смежные вопросы

    • Нет связанных вопросов^_^