/
Inicio :: Foros

 F.A.Q.F.A.Q.                  Conéctese para revisar sus mensajesConéctese para revisar sus mensajes   

sobre C y C++

 
      Índice del Foro elrincondelc.com -> Principiantes C/C++
Ver tema anterior :: Ver siguiente tema  
AutorMensaje
spartan117



Registrado: 26 Oct 2005
Mensajes: 43
Ubicación: monterrey

MensajePublicado: 13/11/2007 5:41 am
Título: sobre C y C++

okey , yo lei todo un libro de C y C++ pero se me dificulto cuando empezo en C++ porque no logro ver la diferencia entre los objetos y las estructuras cuales son las direrencias ???

porque son mejores??!?

bueno gracias de antemano
Volver arriba
rir3760



Registrado: 01 Oct 2004
Mensajes: 3770
Ubicación: Mexico

MensajePublicado: 13/11/2007 6:33 am
Título:

Si te refieres a las clases incluidas con la biblioteca estandar de C++ como string y vector sus ventajas son todas la caracteristicas ya incluidas, uno de los principales con la clase string es el ajuste automatico de memoria.

Un ejemplo sencillo sacado del libro "Thinking in C++" es:
Código:
#include <string>
#include <iostream>
#include <fstream>

using namespace std;

int main(){
  ifstream in("FillString.cpp");
  string s, line;
  while(getline(in, line))
    s += line + "\n";
  cout << s;
}

Realizar la misma operacion solo con estructuras "a la C" es posible pero seria uno, como programador, el que tenga que implementar funciones para verificar si el bloque de memoria es suficiente para almacenar la cadena.

Solo con fines demostrativos una funcion de un proyecto opensource (maktor) que realiza la operacion de leer una linea de texto de longitud variable de un archivo en C estandar es:
Código:
/*
** Esta funcion lee una linea de texto del stream en modo "tr" o "r".
**
** Si no ocurren errores su valor de retorno es el numero de caracteres
** que pudo leer con exito incluyendo el caracter de linea nueva (el '\n')
** y al parametro de salida 'error' se le asigna el valor SALIDA_OK.
**
** En caso de error o fin de archivo su valor de retorno es 0 y al parametro
** de salida 'error' se le asigna, dependiendo del caso, SALIDA_ERROR_CRITICO
** o EOF.
*/
size_t obt_linea(FILE *entrada, char **linea, int *error)
{
   char *bufer;
   char *aux;
   size_t const incremento = 128;
   size_t capacidad_max = incremento;
   size_t i;
   int c;
   
   /*
   ** Por razones practicas (brevedad) se asume que la funcion termina
   ** debido a un error interno critico (error con malloc o realloc).
   */
   *linea = NULL;
   *error = SALIDA_ERROR_CRITICO;
   
   if ((bufer = malloc(capacidad_max)) == NULL)
      return 0;
   
   /* Procesar cada uno de los caracteres de la linea de texto */
   for (i = 0; (c = fgetc(entrada)) != EOF && c != '\n'; i++){
      bufer[i] = c;
     
      /*
      ** Verificar si el bufer esta lleno. Se reservan los dos ultimos
      ** caracteres del bufer para almacenar los caracteres '\n' y '\0'.
      */
      if (i == capacidad_max - 2){
         if ((aux = realloc(bufer, capacidad_max + incremento)) == NULL){
            free(bufer);
            return 0;
         }else {
            bufer = aux;
            capacidad_max += incremento;
         }
      }
   }
   
   /* Agregar el '\n' (si es necesario) y el '\0' */
   if (c == '\n')
      bufer[i++] = '\n';
   bufer[i] = '\0';
   
   if (i > 0){
      /* Reajuste final del bufer (+1 para el '\0') */
      if ((aux = realloc(bufer, i + 1)) == NULL){
         free(bufer);
         return 0;
      }else {
         *linea = aux;
         *error = SALIDA_OK;
      }
   }else {
      /*
      ** En caso de una linea de texto vacia ("") el bloque de memoria
      ** se libera (tanto '*linea' como 'bufer' son 'NULL') y se indica
      ** que la causa del error es 'EOF'.
      */
      free(bufer);
      *error = EOF;
   }
   
   return i;
}


Un saludo
_________________
The capacity to learn is a gift;
The ability to learn is a skill;
The willingness to learn is a choice.
--
Rebec of Ginaz
Volver arriba
mamntc02



Registrado: 30 Abr 2007
Mensajes: 263

MensajePublicado: 13/11/2007 8:05 am
Título:

Hola,

De hecho, las clases y las estructuras son lo mismo, exactamente!!! No obstante hay un par de diferencias relativas a la visibilidad de los datos (encapsulación).
Si no se indica al compilador el nivel de aceso de los atributos de una clase, éstos seran privados, mientras q en una estructura seran publicos, es decir:
Código:

class CPrueba{
   int valor;
   ...
};
struct SPrueba{
   int valor;
   ...
};

CPrueba* cprueba = new CPrueba;
SPrueba* sprueba = new SPrueba;

cprueba->valor = 0; // ERROR, por ser de acceso privado (necesitas un método setter y getter)
sprueba->valor = 0; // CORRECTO, acceso publico


La otra diferencia tiene q ver con la herencia, y también con el acceso.
Heredar de una clase, por defecto el acceso es privado, mientras q de una estructura es público. Te pongo también un ejemplo de esto q te puede ayudar a entenderlo(este ejemplo lo he encontrado, no lo he hecho yo... Wink)
Código:

  class B { /* ... */ };
  class D1 : private B { /* ... */ };
  class D2 : public B { /* ... */ };
  class D3 : B { /* ... */ };     // B private by default
  struct D4 : public B { /* ... */ };
  struct D5 : private B { /* ... */ };
  struct D6 : B { /* ... */ };    // B public by default
  class D7 : protected B { /* ... */ };
  struct D8 : protected B { /* ... */ };
  Here B is a public base of D2, D4, and D6, a private base of  D1,  D3,
  and D5, and a protected base of D7 and D8.


Por cierto, lo q te comento es la diferencia entre Clases y Estructuras, y no entre objetos y estructuras, lo cual no tiene sentido!!

Saludos.
Volver arriba
      Índice del Foro elrincondelc.com -> Principiantes C/C++
Página 1 de 1Todas las horas están en GMT - 8 Horas

 
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas

(c) ElRincondelC.com

Un proyecto de UrlanHeat.com