-4

次のヘッダー ファイルがあるとします。

#ifndef TEST_HEADER
#define TEST_HEADER 

class myFoo
{
    public:
    myFoo(unsigned long *ulbaz):
    baz(ulbaz)
    {
      *baz++;
    }
    ~myFoo()
    {
      *baz--;
    }
    private:
        unsigned long *baz;
    };

#define DEFINE_A( a ) myFoo bar( a);
#define DEFINE_B( b ) 

#endif  // test_header

コード例:

// code.cpp

#include "test.h"
unsigned long mylong = 0L;


int main()
{
    DEFINE_A( &mylong);
    DEFINE_B( &mylong);
}

ご覧のとおり、DEFINE_B空です。私が理解していないこと:DEFINE_Bが呼び出されるたびに、 からデストラクタに入り、コールmyFooスタック内でそれを見ることができます - どうすればよいですか? 私の知る限り、空defineは に展開され;ます。

編集: このコードは機能するようになりました。

4

3 に答える 3

2

次のメインを実行していると仮定しています。

int main (int argc, char const* argv[])
{
    unsigned long mylong = 0L;
    DEFINE_A( &mylong);
    DEFINE_B( &mylong);
    return 0;
}

DEFINE_B( b )は何も展開されず、クラスのデストラクタが表示myFooされます。これは、スコープの最後に到達すると、その内部で作成されたすべてのオブジェクトがデストラクタを呼び出すことによって削除されるためです。

于 2013-08-28T12:41:11.783 に答える
1

これは、オブジェクトがスコープから外れることが原因です。これを示す次の例を想像してください。

#include <iostream>

#define EXAMPLEMACRO

class Test {
public:
    Test() {}
    ~Test() {}
}

int main() {

    //Open a new scope
    {
        EXAMPLEMACRO //This doesn't do anything!
        Test t();
        EXAMPLEMACRO //This called the destructor?
    }

    return 0;
}

デストラクタを呼び出すのではなく、オブジェクトが範囲外になるだけです。

于 2013-08-28T12:38:09.817 に答える