2009-06-09 2 views
0

В следующем коде gcc не создает экземпляры объектов NSP :: Admin и NSP :: Server. Он просто пропускает их.Формирование экземпляра объектов с помощью gcc

int main(int argc, char **argv) 
{ 
    // Here we bootstrap google logging 
    // we also install the signal handler 
    google::InitGoogleLogging(argv[0]); 
    google::InstallFailureSignalHandler(); 
    // now we parse the arguments with gflags 
    google::ParseCommandLineFlags(&argc, &argv, true); 

    NSP::Admin   admin(); 
    NSP::server   server(); 

    DLOG(INFO) << "boost io_service run"; 
    NSP::IOService::getIOService().run(); 
} 

Если я добавлю параметр в CTORS, они создаются. Пример:

NSP::Admin   admin(1); 
    NSP::server   server(1); 

Я не могу разорвать точку на них с помощью GDB, и шаговый пропускает их. Эти два объекта регистрируются в службе повышения io и вызывают метод в их CTORS.

NSP - это пространство имен проектов.

Использование gcc4.2 на FreeBSD, glog, gflags и boost asio.

ответ

12

Это не создает экземпляр их, потому что NSP::Admin admin(); не создает каких-либо объектов.

Вместо этого это объявление функции-прототипа функции, которая возвращает объект NSP :: Admin и принимает недействительные аргументы. Это один из тех странных синтаксисов C++. Второй работает, потому что компилятор не «путается», думая, что это прототип функции. Он может ясно видеть, что вы создаете объект.

Для создания объекта с помощью Использовать конструктор по умолчанию

NSP::Admin   admin; // (without parenthesis) 
NSP::server   server; 
3

Try:

NSP::Admin   admin; 
NSP::server   server; 

Пример программы:

#include <iostream> 

class Foo 
{ 
public: 
     Foo() { std::cout << "CTR" << std::endl; } 
}; 

int a() 
{ 
    std::cout << "a in" << std::endl; 
    Foo foo(); 
    std::cout << "a out" << std::endl; 
} 

int b() 
{ 
    std::cout << "b in" << std::endl; 
    Foo foo; 
    std::cout << "b out" << std::endl; 
} 

int main() 
{ 
    a(); 
    b(); 
    return 0; 
} 
Смежные вопросы