ctor10.c

来自「开放源码的编译器open watcom 1.6.0版的源代码」· C语言 代码 · 共 112 行

C
112
字号
// 94/06/14 -- J.W.Welch        -- changed CDO copy ctor to remove side effect
#include "fail.h"

struct CDO;

struct SIGS {
    struct ITEM {
        ITEM *next;
        CDO *addr;
        ITEM( ITEM *next, CDO *addr ) : next(next), addr(addr) {}
    };
    ITEM *list;
    SIGS() : list(NULL) {}
    int already_ctored( CDO * );
    int already_dtored( CDO * );
    int all_dtored( void ) { return list == NULL; }
};

unsigned count;

struct CDO {    // ctor/dtor once
    int signature;
    unsigned index;
    CDO( int );
    CDO( CDO const & );
    ~CDO();
};

SIGS check;

int SIGS::already_ctored( CDO *addr )
{
    // printf( "checking ctor of %d %u\n", addr->signature, addr->index );
    for( ITEM *curr = list; curr != NULL; curr = curr->next ) {
        if( curr->addr == addr ) {
            fail(__LINE__);
            return( 1 );
        }
    }
    ITEM *item = new ITEM( list, addr );
    list = item;
    return( 0 );
}

int SIGS::already_dtored( CDO *addr )
{
    ITEM **prev = &list;

    // printf( "checking dtor of %d %u\n", addr->signature, addr->index );
    for( ITEM *curr = list; curr != NULL; curr = curr->next ) {
        if( curr->addr == addr ) {
            *prev = curr->next;
            delete curr;
            return( 0 );
        }
        prev = &(curr->next);
    }
    fail(__LINE__);
    return( 1 );
}

CDO::CDO( int v ) : signature(v), index(++count) {
    if( check.already_ctored( this ) ) {
        printf( "failure signature: %d\n", signature );
    }
}

CDO::CDO( CDO const &s ) : signature(s.signature), index(++count) {
    if( check.already_ctored( this ) ) {
        printf( "failure signature: %d\n", signature );
    }
}

CDO::~CDO() {
    if( check.already_dtored( this ) ) {
        printf( "failure signature: %d\n", signature );
    }
}

CDO inc_signature( CDO x )
{
    return CDO( x.signature + 1 );
}

struct C1 : CDO {
    C1(int);
    int val() const { return signature + 100; }
};

C1::C1( int v ) : CDO( inc_signature( CDO( v ) ) )
{
    CDO x( __LINE__ );
}

struct S : CDO {
    int x;
    S() : x(C1(45).val()), CDO(23) {}
};

int foo()
{
    S v;
    return v.x;
}

int main()
{
    if( foo() != 146 ) fail(__LINE__);
    if( ! check.all_dtored() ) fail(__LINE__);
    _PASS;
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?