2009-06-09 11 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でそれらのポイントを破ることができず、ステッピングが、それらをスキップします。 これらの2つのオブジェクトは、自分自身をboost ioサービスに登録し、CTORSでメソッドを呼び出します。

NSPはプロジェクトの名前空間です。

FreeBSDでgcc4.2を使用している場合は、 glog、gflags、およびboost asioです。

答えて

12

NSP::Admin admin();は、任意のオブジェクトを作成していないので、それはそれらをインスタンス化しません。

代わりに、NSP :: Adminオブジェクトを返す関数の関数プロトタイプの宣言であり、void引数をとります。それはそれらの厄介なC++構文の一つです。コンパイラが関数プロトタイプであると考えると、混乱することはありません。オブジェクトを作成していることがはっきり分かります。デフォルトコンストラクタの使用に

NSP::Admin   admin; // (without parenthesis) 
NSP::server   server; 
を使用してオブジェクトを作成するには

3

試してみてください。

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; 
} 
関連する問題