lacabra25 escribió:Entiendo, sobrecarga de operadores solo en C++, solo una cosa, ¿seria posible tener la parte de los vectores junto con la sobrecarga de operadores en C++ y usarlo en codigo en C haciendo un includo de la cabecera C++ de los vectores y asi usarlos en otra parte de codigo que este en C (mezclar C con C++ en definitiva)?
No, no es posible. Aunque la programación orientada a objetos es posible en C, no lo es la adición de nuevos "tipos" como en C++. Puedes incluir código C en C++, pero no a la inversa.
lacabra25 escribió:y ¿como se realizaria la sobrecarga de operadores en C++?
Se realiza de manera similar a una función, con la característica particular de que se hace uso de la palabra
operator, algo como esto:
- Código: Seleccionar todo
void operator*( int escalar, MiVector& v ) {
for ( int i = 0; i < v.tamanio; i++ ) {
v.valores[ i ] *= escalar;
}
}
En este caso, se ha sobrecargado el operador * para el caso en que tenga como parámetros un int y un tipo MiVector.
Algunos detalles sobre la sobrecarga de operadores: Las funciones de sobrecarga pueden declararse como funciones miembro de una clase, o como funciones externas a la clase (funciones no miembro).
Cuando el tipo que se está definiendo (la clase), se empleará como parámetro izquierdo del operador (operadores binarios como +, -, *), puede ser una función miembro o no, mientras que, si será un parámetro del lado derecho, debe declararse como una función no miembro (externa a la clase).
En el código que puse, se trata de una función externa a la clase MiVector, pues el tipo MiVector se recibe como parámetro del lado derecho (escalar*MiVector), las variables tamanio y valores son miembros de la clase MiVector, siendo la primera un entero que indica el número de valores y la segunda un puntero a los valores de MiVector.
Debido a que las funciones que no son miembro de una clase no pueden acceder directamente a las variables miembro de dicha clase, si ambas variables (tamanio y valores) fueron declaradas como privadas en la clase MiVector, la función sobrecargada debe declararse como "amiga" de la clase para poder acceder a ellas como se está haciendo en el código que puse.
Con variables privadas, la declaración de la clase MiVector sería más o menos así:
- Código: Seleccionar todo
class MiVector {
// la función debe ser "amiga" para poder acceder a las variables
// miembro
friend void operator*( int escalar, MiVector& v );
private:
int* valores;
int tamanio;
};
Y de esta forma con variables públicas:
- Código: Seleccionar todo
class MiVector {
// las variables son públicas, no se necesita ninguna declaración
// especial para que la función de sobrecarga acceda a las variables
public:
int* valores;
int tamanio;
};
Por supuesto, la declaración de la clase está incompleta, espero que se entienda el ejemplo

.
Ahora, con la función de sobrecarga que escribimos, esto es válido:
- Código: Seleccionar todo
MiVector v;
int escalar = 2;
escalar * v;
pero esto no:
- Código: Seleccionar todo
v * escalar;
Esto porque no se ha sobrecargado el operador * para que reciba un tipo MiVector como parámetro izquierdo y un int como parámetro derecho. Es decir, hay que sobrecargar dos veces el operador si deseamos que su funcionamiento sea conmutativo

.
En internet hay muchos recursos para leer sobre sobrecarga de operadores, por ejemplo en C con clase:
http://c.conclase.net/curso/index.php?cap=035
Yo tengo un libro que recomiendo mucho para quienes deseamos aprender C++: C++ Cómo programar de Deitel, yo tengo la cuarta edición, que me gusta mucho pues la primera parte está dedicada a la programación estructurada ("el C en C++"), para luego continuar con las clases y la orientación a objetos (en la quinta edición cambió el enfoque, aunque no he tenido oportunidad de revisarla).
Por último, yo también estoy aprendiendo y no manejo estos temas a la perfección, pero estamos aquí para compartir y echarnos la mano

.