#36:
Vamos por partes:
"no hay que repetir el codigo en 2 archivos (.h .c / .cpp) aunque se pueden usar Interfaces y Clases. "
No sé que conocimientos tienes de C++ pero lo que has dicho no tiene ningún sentido.
Observa estos 3 programas:
TEST 1
//Archivo test.c
#include <iostream>
using namespace std;
class prueba
{
public:
void saludar()
{
cout << "Hola kas";
}
};
int main()
{
prueba hola;
hola.saludar();
return 0;
}
TEST 2
//Archivo test.h
#include <iostream>
using namespace std;
class prueba
{
public:
void saludar()
{
cout << "Hola kas";
}
};
//Archivo test.cpp
#include "test.h"
int main()
{
prueba hola;
hola.saludar();
return 0;
}
TEST 3
//Archivo test.h
#include <iostream>
using namespace std;
class prueba
{
public:
void saludar();
};
//Archivo prueba.cpp
#include "test.h"
void prueba::saludar()
{
cout << "Hola kas";
}
//test.cpp
#include "test.h"
int main()
{
prueba hola;
hola.saludar();
return 0;
}
Estos 3 programas, que vienen en 1 archivo, 2 archivos, y 3 archivos, son exactamente el mismo, y hacen exactamente lo mismo.
Ni en C ni en C++ existe alguna norma que te obligue a dividir el programa en archivos, lo hacen los programadores por que quieren, y tienen un buen motivo para hacerlo. Tener el código organizado. Además, yo no veo que el código se repita en ningún momento, en un sitio pones la declaración, y en otro la implementación, ¿donde ves tú el código repetido?
Tanto C y C++ permiten separar las declaraciones de las definiciones, donde una declaración es "tal cosa existe", y una definición es "tal cosa consiste en esto". Poniendo las declaraciones en un archivo separado, cuando alguien tiene que referenciar código fuente de otro programa, solo necesita las declaraciones, no necesita el código de la implementación, que puede ni siuiera existir, y simplemente tienes el binario compilado. Con el archivo de declaraciones te vale.
Si te fijas, esto es muy parecido al sistema de imports que tiene Java, pero existe una sutil diferencia... import, solo te deja importar clases, mientras que #include, te deja incluir cualquier cosa que sea texto, ya sea la declaración de una clase, o directamente código fuente sin compilar.
Lo que parece que no consigues ver, es la que la diferencia entre C++ y Java, es que C++ ofrece la mayor libertad posible, y es responsabilidad del programador usar esa libertad de forma coherente para hacer código legible.
Con Java tienes import, y con eso importas un paquete, o una clase de un paquete. Con C++ tienes #include que te da libertad para estructurar el código del programa como te salga del ojal, aunque la más frecuente es la ya mencionada: declaraciones en el .h, implementaciones en el .cpp.
"No hay defines extraños"
Cuando puedas, pon un ejemplo, y vemos a que te refieres con "un define extraño".
"las referencias a otros ensamblados son muy rigidas"
No entiendo en que punto esto es una ventaja, ¿podrías explicarte mejor?.
"Continuo sin entender xq despues de 7 u 8 años muchos programadores continuan usando C/C++ para ahcer aplicaciones de escritorio"
Primero, por lo mismo que te he explicado con el tema de los include.... libertad, segundo, rendimiento. C++ pone pocas restricciones y te deja diferentes opciones para hacer lo mismo, y hay muchos programas que no son posibles o no son eficientes utilizando las "soluciones predefinidas" que te da Java o C#. Sin ir más lejos, ¿cuantos juegos para PC de última generación están escritos en Java o C#?
A ver si me entiendes, está claro que para infinidad de trabajos, C y C++ es una mala opción, por que esa misma libertad de la que te hablo, significa que hay cantidad de detalles que tienes que manejar tú mismo, y que en otros lenguajes como Java, ya se encarga el entorno de ejecución de manejarlos, y a ti te queda libertad para centrate en tú programa.
Pero es que en otros casos, necesitas esa libertada para hacer lo que quieres.
Tu problema es que metes todas las aplicaciones para Windows en un mismo saco,
Yo no te niego que habrá programas escritos en C++ para windows, que se hubiesen terminado más rápido, el código fuente sería más corto, y funcionarían igual, si se hubiesen hecho en Java o C#, pero eso no quita que hay otros programas que necesitan de las características que C++ ofrece y que no están disponibles en otros lenguajes.