elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Introducción a Git (Primera Parte)


  Mostrar Mensajes
Páginas: [1] 2
1  Programación / Programación C/C++ / clase para trabjar con listas simples en: 4 Enero 2011, 11:42 am
¡Buenas señores! He estado trabajando en un código que me permita trabajar con listas simples a modo de array dinámico y este es el resultado. La idea era que el comportamiento final de la clase fuera fácil e intuitivo, y espero haberlo conseguido  ;-)... Sin embargo la mayor limitación de mi trabajo radica en la forma de agregar los datos, pues sólo se puede introducir a la cabeza o a la cola de la lista, y no de forma aleatoria. A pesar de ello espero que les pueda servir de ayuda en códigos más complicados  :D

Código
  1. // Autor: Namida
  2. // Fecha: 04 enero 2011
  3.  
  4. /// DIRECTIVAS GENERALES DEL PREPROCESADOR
  5. #define _list_
  6.  
  7. #ifndef NULL
  8. #define NULL 0
  9. #endif
  10.  
  11. #define OFF false
  12. #define ON true
  13.  
  14.  
  15. ///CODIGO
  16. // Declaraciones Previas
  17. template<typename TYPE> class list;
  18. template<typename TYPE> list<TYPE> &operator < (list<TYPE> &L,TYPE X);
  19. template<typename TYPE> list<TYPE> &operator > (list<TYPE> &L,TYPE X);
  20. template<typename TYPE> list<TYPE> &operator ~ (list<TYPE> &L);
  21.  
  22. // Declaracion
  23. template<typename TYPE> class list
  24. {
  25. private:
  26.  
  27. /*Definicion del nodo*/
  28. struct node{
  29. TYPE data;
  30. node* next_node;
  31. };
  32.  
  33. /*Informacion sobre la lista*/
  34. node* first_node;
  35. unsigned list_size;
  36. bool delete_mode;
  37.  
  38. public:
  39.  
  40. /*Constructor de clase*/
  41. list();
  42.  
  43. /*Operadores*/
  44. //Escritura
  45. friend list<TYPE> &operator < <TYPE>(list<TYPE> &L,TYPE X);
  46. friend list<TYPE> &operator > <TYPE>(list<TYPE> &L,TYPE X);
  47. //Lectura
  48. TYPE operator [] (unsigned N);
  49. //Borrado
  50. friend list<TYPE> &operator ~ <TYPE>(list<TYPE> &L);
  51.  
  52. /*Descriptor*/
  53. unsigned Size();
  54.  
  55. };
  56.  
  57. // Metodos
  58. /*Constructor*/
  59. template<typename TYPE> list<TYPE>::list(){
  60. first_node=NULL;
  61. list_size=0;
  62. delete_mode=OFF;
  63. };
  64. /*Operadores*/
  65. //Escritura
  66. template<typename TYPE> list<TYPE> &operator < (list<TYPE> &L,TYPE X){
  67. list<TYPE>::node* new_node=new list<TYPE>::node;
  68. new_node->data=X;
  69. new_node->next_node=NULL;
  70.  
  71. if (L.first_node!=NULL){
  72. list<TYPE>::node* aux_node=L.first_node;
  73. while (aux_node->next_node!=NULL){
  74. aux_node=aux_node->next_node;
  75. };
  76. aux_node->next_node=new_node;
  77. }else{
  78. L.first_node=new_node;
  79. };
  80. L.list_size+=1;
  81. return L;
  82. };
  83. template<typename TYPE> list<TYPE> &operator > (list<TYPE> &L,TYPE X){
  84. list<TYPE>::node* new_node=new list<TYPE>::node;
  85. new_node->data=X;
  86. new_node->next_node=L.first_node;
  87. L.first_node=new_node;
  88. L.list_size+=1;
  89. return L;
  90. };
  91. //Lectura
  92. template<typename TYPE> TYPE list<TYPE>::operator [] (unsigned N){
  93. try{
  94. if (N<list_size){
  95. switch (delete_mode){
  96. case OFF:
  97. {
  98. node* aux_node=first_node;
  99. for(unsigned i=0;i<N;i++){
  100. aux_node=aux_node->next_node;
  101. };
  102. return aux_node->data;
  103. };
  104. case ON:
  105. {
  106. if (N==0){
  107. node* aux_node=first_node;
  108. first_node=aux_node->next_node;
  109. delete aux_node;
  110.  
  111.  
  112. }else{
  113. node* aux_node=first_node;
  114. for(int i=0;i<int(N)-1;i++){
  115. aux_node=aux_node->next_node;
  116. };
  117. node* delete_node=aux_node->next_node;
  118. aux_node->next_node=aux_node->next_node->next_node;
  119. delete delete_node;
  120. };
  121. list_size-=1;
  122. delete_mode=OFF;
  123. throw 0;
  124. };
  125. };
  126. }else{
  127. throw 0;
  128. };
  129. }catch(int code){
  130. TYPE X=TYPE();
  131. return X;
  132. };
  133. };
  134. //Borrado
  135. template<typename TYPE> list<TYPE> &operator ~ (list<TYPE> &L){
  136. L.delete_mode=ON;
  137. return L;
  138. };
  139.  
  140. /*Descriptor*/
  141. template<typename TYPE> unsigned list<TYPE>::Size(){
  142. return list_size;
  143. };
  144.  
  145. #undef OFF
  146. #undef ON
  147.  
Un ejemplo de su uso
[/size]
Código
  1. #include"list.h"
  2.  
  3. int main(int argc,char* argv[]){
  4.  
  5. //Creacion de una lista tipo int
  6. list<int> L=list<int>();
  7.  
  8. /* Agregar datos
  9. A la cola*/
  10. L<0<1<2<3<4;
  11. /*A la cabeza*/
  12. L>5>6;
  13.  
  14. //Estado actual de la lista: 6-5-0-1-2-3-4
  15.  
  16. //Leer informacion de la lista
  17. L[1]; //Devuelve el numero 5
  18.  
  19. //Borrado
  20. (~L)[1]; //Elimina el numero 5 de la lista
  21.  
  22. L.Size(); //Devuelve el tamagno de la lista
  23.  
  24. return 0;
  25. };
  26.  
2  Programación / Programación C/C++ / Sobrecarga de operadores (con punteros a clase) en: 29 Diciembre 2010, 12:42 pm
Solucionado:

Declaraciones previas; clase y operadores
Código:
template<typename TYPE>class obj;
template<typename TYPE>obj<TYPE> &operator < (obj<TYPE> &OBJ, TYPE X);

Declaración de la clase:
Código:
template<typename TYPE>class obj{
     [...]
     friend obj<TYPE> &operator < <TYPE> (obj<TYPE> &OBJ, TYPE X);
};

Declaración del operador:
Código:
template<typename TYPE>obj<TYPE> &operator (obj<TYPE> &OBJ, TYPE X){
     [...]
     return OBJ;
};

Sin más, espero que les resulte de ayuda! :D!
3  Programación / Programación C/C++ / Re: Sobre carga de operador [Visual Studio 2010] en: 17 Diciembre 2010, 09:40 am
Muchas gracias Littlehorse!! El problema me ha quedado bastante claro con tu explicación. Ya probé a realizarlo de dicha forma  y va sin problemas, asi que.... ¡Problema resuelto!  ;-)
4  Programación / Programación C/C++ / Re: Sobre carga de operador [Visual Studio 2010] en: 16 Diciembre 2010, 07:56 am
Código:
//Definición de la clase
template<typename TYPE>class matriz{
protected:
unsigned filas,columnas;
TYPE** datos;
public:
matriz (unsigned FILAS,unsigned COLUMNAS);
friend std::ostream &operator << (std::ostream &os,matriz<TYPE> X);
};

//Definición del constructor
template<typename TYPE> matriz<TYPE>::matriz(unsigned FILAS, unsigned COLUMNAS){
filas=FILAS;
columnas=COLUMNAS;
datos=new TYPE *[filas];
for(unsigned i=0;i<filas;i++){
datos[i]=new TYPE [columnas];
for(unsigned j=0;j<columnas;j++){
datos[i][j]=0;
};
};
};

//Sobrecarga del operador
template<typename TYPE> std::ostream &operator << (std::ostream &os, matriz<TYPE> X){
for(unsigned i=0;i<X.filas;i++){
for(unsigned j=0;j<X.columnas;j++){
os<<X.datos[i][j]<<'\t';
};
os<<'\n';
};
return os;
};


int main(int argc,char* argv[]){
matriz<int> A=matriz<int>(4,4);
std::cout<<A<<std::endl;
std::system("pause");
return 0;
};

Ahí te dejo el código básico de lo que, en principio, estoy intentando ejecutar. A ver si le puedes encontrar el fallo por el que no va. Sin más, gracias por todo :D
5  Programación / Programación C/C++ / Re: Sobre carga de operador [Visual Studio 2010] en: 16 Diciembre 2010, 00:26 am
Muchas gracias por tu respuestas. Sí, el error es de definición. Implementando directamente la sobrecarga del operador dentro de la clase si me funciona (el segundo ejemplo que mencionas). He intentado separar la declaración de la sobrecarga de su implementación sin éxito.

De todas formas el error dado por el compilador es el siguiente:
Citar
1>------ Operación Generar iniciada: proyecto: Librerias, configuración: Debug Win32 ------
1>  main.cpp
1>main.obj : error LNK2019: símbolo externo "class std::basic_ostream<char,struct std::char_traits<char> > & __cdecl operator<<(class std::basic_ostream<char,struct std::char_traits<char> > &,class matrix<int>)" (??6@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@std@@AAV01@V?$matrix@H@@@Z) sin resolver al que se hace referencia en la función _main
1>C:\Documents and Settings\mis documentos\visual studio 2010\Projects\ProyectoDePruebas\Debug\Librerias.exe : fatal error LNK1120: 1 externos sin resolver
========== Generar: 0 correctos, 1 incorrectos, 0 actualizados, 0 omitidos ==========

Sin más, gracias por la ayuda ;)
6  Programación / Programación C/C++ / Sobre carga de operador [Visual Studio 2010] en: 15 Diciembre 2010, 21:33 pm
¡Hola a todos! Tengo el siguiente problema. No se como sobrecargar un operador dentro de una plantilla. Lo he intentando de la siguiente forma y me tira error.

Código:
template<TYPE>class A{
[...] /*Resto del código*/
friend std::ostream &operator << (std::ostream &os,A<TYPE> X);
};

template<TYPE> std::ostream &operator <<(std::ostream &os,A<TYPE> X){
[...] /*Resto del código*/
return os;
};

Gracias de antemano por su ayuda ;)
7  Programación / Programación C/C++ / Re: C++, Asociar Icono al Ejecutable en: 27 Julio 2010, 15:28 pm
Gracias por la info xD... ahora toca estudiarlo ;)
8  Programación / Programación C/C++ / C++, Asociar Icono al Ejecutable en: 27 Julio 2010, 13:23 pm
¡Hola! Llevo bastante tiempo buscando sobre el tema pero no he encontrado nada sobre C++ referente al tema. Mi pregunta es si es posible asociar un icono al ejecutable (El archivo .exe, por si no se me entiende xD) desde el propio código¿? y de ser así, si serian tan amable de explicarme...

Muchas Gracias de antemano :D
9  Programación / Programación C/C++ / Re: Control de impresion en: 20 Mayo 2010, 22:10 pm
Por desear que no sea, no? xD... Aqui no se hacen tareas... Si lo que quieres es ayuda, postea tu código ó pseudocódigo, e intetaremos echarte una mano...

Si hace poco empezaste a programar te aconseje que empiezes por algo mas sencillo... sin más. Suerte con ese proyecto :rolleyes:
10  Programación / Programación C/C++ / Re: cerr en: 20 Mayo 2010, 00:05 am
Yo una sola vz use el compiler ese... (visual) y no necesitaba el using namespace... solo la libreria que dijo Namida...

Edito: Lo digo para ver si alguien me dice si es necesario o no... Yo se que con std::cin>>x; se resuelve sin usar el using namespace pero sin ninguno de los 2 funciona? es decir solo cin>>x; sin using namcespace ni std::??

Tienes dos opciones... std::cin,cout o lo que sea o declarar el espacio de nombres al principio (using namespace std) y olvidarte del prefijo y poner directamente cin, cout o lo que sea XD
Páginas: [1] 2
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines