Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - Namida

#1
¡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 (cpp) [Seleccionar]

// Autor: Namida
// Fecha: 04 enero 2011

/// DIRECTIVAS GENERALES DEL PREPROCESADOR
#define _list_

#ifndef NULL
#define NULL 0
#endif

#define OFF false
#define ON true


///CODIGO
// Declaraciones Previas
template<typename TYPE> class list;
template<typename TYPE> list<TYPE> &operator < (list<TYPE> &L,TYPE X);
template<typename TYPE> list<TYPE> &operator > (list<TYPE> &L,TYPE X);
template<typename TYPE> list<TYPE> &operator ~ (list<TYPE> &L);

// Declaracion
template<typename TYPE> class list
{
private:

/*Definicion del nodo*/
struct node{
TYPE data;
node* next_node;
};

/*Informacion sobre la lista*/
node* first_node;
unsigned list_size;
bool delete_mode;

public:

/*Constructor de clase*/
list();

/*Operadores*/
//Escritura
friend list<TYPE> &operator < <TYPE>(list<TYPE> &L,TYPE X);
friend list<TYPE> &operator > <TYPE>(list<TYPE> &L,TYPE X);
//Lectura
TYPE operator [] (unsigned N);
//Borrado
friend list<TYPE> &operator ~ <TYPE>(list<TYPE> &L);

/*Descriptor*/
unsigned Size();

};

// Metodos
/*Constructor*/
template<typename TYPE> list<TYPE>::list(){
first_node=NULL;
list_size=0;
delete_mode=OFF;
};
/*Operadores*/
//Escritura
template<typename TYPE> list<TYPE> &operator < (list<TYPE> &L,TYPE X){
list<TYPE>::node* new_node=new list<TYPE>::node;
new_node->data=X;
new_node->next_node=NULL;

if (L.first_node!=NULL){
list<TYPE>::node* aux_node=L.first_node;
while (aux_node->next_node!=NULL){
aux_node=aux_node->next_node;
};
aux_node->next_node=new_node;
}else{
L.first_node=new_node;
};
L.list_size+=1;
return L;
};
template<typename TYPE> list<TYPE> &operator > (list<TYPE> &L,TYPE X){
list<TYPE>::node* new_node=new list<TYPE>::node;
new_node->data=X;
new_node->next_node=L.first_node;
L.first_node=new_node;
L.list_size+=1;
return L;
};
//Lectura
template<typename TYPE> TYPE list<TYPE>::operator [] (unsigned N){
try{
if (N<list_size){
switch (delete_mode){
case OFF:
{
node* aux_node=first_node;
for(unsigned i=0;i<N;i++){
aux_node=aux_node->next_node;
};
return aux_node->data;
};
case ON:
{
if (N==0){
node* aux_node=first_node;
first_node=aux_node->next_node;
delete aux_node;


}else{
node* aux_node=first_node;
for(int i=0;i<int(N)-1;i++){
aux_node=aux_node->next_node;
};
node* delete_node=aux_node->next_node;
aux_node->next_node=aux_node->next_node->next_node;
delete delete_node;
};
list_size-=1;
delete_mode=OFF;
throw 0;
};
};
}else{
throw 0;
};
}catch(int code){
TYPE X=TYPE();
return X;
};
};
//Borrado
template<typename TYPE> list<TYPE> &operator ~ (list<TYPE> &L){
L.delete_mode=ON;
return L;
};

/*Descriptor*/
template<typename TYPE> unsigned list<TYPE>::Size(){
return list_size;
};

#undef OFF
#undef ON


Un ejemplo de su uso
[/size]
Código (cpp) [Seleccionar]

#include"list.h"

int main(int argc,char* argv[]){

//Creacion de una lista tipo int
list<int> L=list<int>();

/* Agregar datos
A la cola*/
L<0<1<2<3<4;
/*A la cabeza*/
L>5>6;

//Estado actual de la lista: 6-5-0-1-2-3-4

//Leer informacion de la lista
L[1]; //Devuelve el numero 5

//Borrado
(~L)[1]; //Elimina el numero 5 de la lista

L.Size(); //Devuelve el tamagno de la lista

return 0;
};
#2
Solucionado:

Declaraciones previas; clase y operadores

template<typename TYPE>class obj;
template<typename TYPE>obj<TYPE> &operator < (obj<TYPE> &OBJ, TYPE X);


Declaración de la clase:

template<typename TYPE>class obj{
    [...]
    friend obj<TYPE> &operator < <TYPE> (obj<TYPE> &OBJ, TYPE X);
};


Declaración del operador:

template<typename TYPE>obj<TYPE> &operator (obj<TYPE> &OBJ, TYPE X){
    [...]
    return OBJ;
};


Sin más, espero que les resulte de ayuda! :D!
#3
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

//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
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
¡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.

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
Gracias por la info xD... ahora toca estudiarlo ;)
#8
¡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
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 C/C++ / Re: cerr
20 Mayo 2010, 00:05 AM
Cita de: El_nuevo_HH en 19 Mayo 2010, 23:58 PM
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