La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

Clases abstractas no polimórficas para C++ Universidad de Costa Rica Escuela de Ciencias de la Computación e Informática Agenda.

Presentaciones similares


Presentación del tema: "Clases abstractas no polimórficas para C++ Universidad de Costa Rica Escuela de Ciencias de la Computación e Informática Agenda."— Transcripción de la presentación:

1 Clases abstractas no polimórficas para C++ adolfo.dimare@ecci.ucr.ac.cr Universidad de Costa Rica Escuela de Ciencias de la Computación e Informática Agenda C++ Polymorphism The Trick A Polymorphic Matrix Implementacion details Recipe Conclusions

2 Clases abstractas no polimórficas para C++ adolfo.dimare@ecci.ucr.ac.cr Universidad de Costa Rica Escuela de Ciencias de la Computación e Informática C++ Polymorphism class Base { public: virtual void doIt()=0; }; // … Base boom; // Error | | error: cannot declare variable `boom' to be of type `Base' | | error: because the following virtual functions are abstract: | | error: virtual void Base::doIt()

3 Clases abstractas no polimórficas para C++ adolfo.dimare@ecci.ucr.ac.cr Universidad de Costa Rica Escuela de Ciencias de la Computación e Informática template void funBase( X & obj ) { obj.setVal( 5 ); } class TheBase { protected: void setVal( int arg ); }; class Derived : public TheBase { public: void setVal( int arg ) { /*... */ } }; void call_ok() { Derived val; // ok val.setVal( 12 ); funBase( val ); }

4 Clases abstractas no polimórficas para C++ adolfo.dimare@ecci.ucr.ac.cr Universidad de Costa Rica Escuela de Ciencias de la Computación e Informática |14| void call_error() { |15| TheBase val; // Error !!! |16| val.setVal( 12 ); |17| funBase( val ); |18| } | | In function `void call_error()': | 7| error: `void TheBase::setVal(int)' is protected |16| error: within this context | | In function `void funBase(X&) [with X = TheBase]': |17| instantiated from here | 7| error: `void TheBase::setVal(int)' is protected | 3| error: within this context

5 Clases abstractas no polimórficas para C++ adolfo.dimare@ecci.ucr.ac.cr Universidad de Costa Rica Escuela de Ciencias de la Computación e Informática The Trick Declaring protected in the base class the method you want to be reimplemented in every derived class, you get support for the compiler to verify that in every derived class the correct specification and implementation has been used.

6 Clases abstractas no polimórficas para C++ adolfo.dimare@ecci.ucr.ac.cr Universidad de Costa Rica Escuela de Ciencias de la Computación e Informática +---------------+ | Matrix_BASE<> | +---------------+ / \ +----------------+ +-----------------+ | Matrix_Dense<> | | Matrix_Sparse<> | +----------------+ +-----------------+ template class Matrix_BASE { public: typedef E value_type; E & operator() (unsigned, unsigned); friend Matrix_BASE operator+ ( const Matrix_BASE& A, const Matrix_BASE& B ); };

7 Clases abstractas no polimórficas para C++ adolfo.dimare@ecci.ucr.ac.cr Universidad de Costa Rica Escuela de Ciencias de la Computación e Informática template bool isDiagonal( const Mat& M ) { if ( M.rows() != M.cols() ) { return false; } typename Mat::value_type ZERO = 0; for (unsigned i=1; i < M.rows(); i++) { for (unsigned j=0; j < i; j++) { if ( M(i,j) != ZERO ) { return false; } else if ( M(j,i) != ZERO ) { return false; } return true; }

8 Clases abstractas no polimórficas para C++ adolfo.dimare@ecci.ucr.ac.cr Universidad de Costa Rica Escuela de Ciencias de la Computación e Informática /// A+B template inline MAT operator+ ( const Matrix_BASE & A, const MAT& B ) { MAT Res = *( (MAT*)(&A) ); add_Matrix(Res,B); return Res; } Avoid ambiguity conflict with other operator+()’s Requieres use of typecast upon usage Res = *( (MAT*)(&A) );

9 Clases abstractas no polimórficas para C++ adolfo.dimare@ecci.ucr.ac.cr Universidad de Costa Rica Escuela de Ciencias de la Computación e Informática /// A+B template inline MAT operator+ ( const Matrix_BASE & A, const MAT& B ) { // MAT Res = *( (MAT*)(&A) ); MAT Res = *( reinterpret_cast ( const_cast< Matrix_BASE * > >(&A) ) ); add_Matrix(Res,B); return Res; } // reinterpret_cast<>() converts any pointer type to any // other pointer type, even of unrelated classes.

10 Clases abstractas no polimórficas para C++ adolfo.dimare@ecci.ucr.ac.cr Universidad de Costa Rica Escuela de Ciencias de la Computación e Informática Non Polymorphic Abstraction /// Res += M template void add_Matrix( MAT& Res, const MAT& M ) { for ( unsigned i=0 ; i<Res.rows() ; ++i ) { for ( unsigned j=0 ; j<Res.cols() ; ++j ) { Res.operator()(i,j) += M(i,j); } return; }

11 Clases abstractas no polimórficas para C++ adolfo.dimare@ecci.ucr.ac.cr Universidad de Costa Rica Escuela de Ciencias de la Computación e Informática Specific Implementation template void add_Matrix( Matrix_Dense & Res, const Matrix_Dense & M ) { T *pRes = Res.m_val; T *pM = & M.m_val[0]; T *pEND = & Res.m_val[M.m_cols * M.m_rows]; for ( ; pRes != pEND; ++pRes, ++pM ) { *pRes += *pM; } return; }

12 Clases abstractas no polimórficas para C++ adolfo.dimare@ecci.ucr.ac.cr Universidad de Costa Rica Escuela de Ciencias de la Computación e Informática Recipe Abstract methods are “protected” Do not include the abstract method implementation Leave constructors and destructor “public” Use friend functions to implement abstract methods Set<>(a,b) uses set_BASE<>(S,a,b) [S is (*this)] Keep abstract functions together Now your C++ Use http://www.doxygen.org

13 Clases abstractas no polimórficas para C++ adolfo.dimare@ecci.ucr.ac.cr Universidad de Costa Rica Escuela de Ciencias de la Computación e Informática Conclusions Abstract classes need not be polymorphic No virtual method costs have to be paid No pointer indirection for invoking virtual methods Different implementations for the same class can be used Use http://www.doxygen.org

14 Clases abstractas no polimórficas para C++ adolfo.dimare@ecci.ucr.ac.cr Universidad de Costa Rica Escuela de Ciencias de la Computación e Informática Source Code http://www.di-mare.com/adolfo/p/BASE/BASE.zip http://www.di-mare.com/adolfo/p/BASE/en/index.html http://www.di-mare.com/adolfo/p/BASE/es/index.html http://www.di-mare.com/adolfo/p/Base.htm ¡¡¡ Muchas Gracias !!!


Descargar ppt "Clases abstractas no polimórficas para C++ Universidad de Costa Rica Escuela de Ciencias de la Computación e Informática Agenda."

Presentaciones similares


Anuncios Google