ptrfun05.cpp

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

CPP
106
字号
#include "dump.h"

#if __WATCOM_REVISION__ >= 8
struct S {

    int foo( int ) { GOOD; return 0; } ;	// (1)
    static int foo( double ) { return 0; }; 	// (2)
    int moo( int ) { GOOD; return 0; }; 	// (3)

    static int goo( double ) { return 0; }; 	// (4)
    extra();
    extra2();
    static int data1;
    double data2;
    double data3;
};

static int S::data1 = 0;

typedef int (S::* MPTR)(int);

/////////////////////////
// data initialization //
/////////////////////////
//    ptr vs mbrptr
///   individual vs. array
////  & vs no &
///// function vs data
////////////////////////

//   member pointer
///  individual
//// using &
MPTR f1 = &S::moo;	// not overloaded (3)
MPTR f2 = &S::foo;	// overloaded (1)
double S::*d1 = &S::data2;
//// not using &
/////// see ptrfun06 which is compiled -ze ///////

///  array
//// using &
int (S::*arr[2])(int) = { &S::moo,	// overloadeded (3)
                          &S::foo };	// not overloaded (1)
double S::*darr[2] = { &S::data2, &S::data3 };

//// not using &
/////// see ptrfun06, which is compiled -ze ///////

//   pointer
///  individual
//// using &
int S::extra(void) // need to be in scope of S to just use goo and &goo
{
int (*f5)(double) = &goo; // not overloaded (4)
int (*f6)(double) = &foo; // overloaded (2)
int *d3 = &data1;
//// not using &
int (*f7)(double) = goo; // not overloaded (4)
int (*f8)(double) = foo; // overloaded (4)
///  array
//// using &
int (*arr2[2])(double) = { &goo,	// not overloaded (4)
    			   &foo };	// overlaoded (2)
int *darr2[2] = { &data1, &data1 };
//// not using &
int (*arr3[2])(double) = { goo,		// not overloaded (4)
    			   foo };	// overlaoded (2)

}

void f( int (S::*p)(int) )
{
    S s;

    (s.*p)(0);
}

int main()
{
    f( f1 );
    CHECK_GOOD(8);
    f( f2 );
    CHECK_GOOD(6+8);
    f( arr[0] );
    CHECK_GOOD(8+6+8);
    f( arr[1] );
    CHECK_GOOD(6+8+6+8);
    return errors != 0;
}
#else
int main( void )
{
  FORCE_GOOD(8);
  CHECK_GOOD(8);
  FORCE_GOOD(6);
  CHECK_GOOD(6+8);
  FORCE_GOOD(8);
  CHECK_GOOD(8+6+8);
  FORCE_GOOD(6);
  CHECK_GOOD(6+8+6+8);
  return errors != 0;
}


#endif

⌨️ 快捷键说明

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