2009-06-09 7 views
0

Dans le code suivant, gcc n'instancie pas les objets NSP :: Admin et NSP :: Server. Il les saute juste.Force l'instanciation des objets avec 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(); 
} 

Si j'ajoute un paramètre au CTORS, il est instancié. Exemple:

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

Je ne peux pas briser le point sur eux avec gdb, et pas à pas les sauts. Ces deux objets s'inscrivent au service boost io et appellent une méthode dans leur CTORS.

NSP est l'espace de noms du projet. Utilisation de gcc4.2 sur FreeBSD, glog, gflags et boost asio.

Répondre

12

Il ne les instancier pas parce que NSP::Admin admin(); ne crée pas d'objets. À la place, il s'agit d'une déclaration d'un prototype de fonction d'une fonction qui retourne un objet NSP :: Admin et prend des arguments vides. C'est l'une de ces syntaxes bizarres en C++. La seconde fonctionne parce que le compilateur n'est pas «confus» en pensant qu'il s'agit d'un prototype de fonction. Il peut clairement voir que vous créez un objet.

Pour créer un objet en utilisant l'utilisation du constructeur par défaut

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

Essayez:

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

Exemple de programme:

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