El fallo me lo da cuando agrego la clase Cadena. He aquí la definición de la clase
Código C++:
Ver original#ifndef _CADENA_
#define _CADENA_
#include <iostream>
#include <stdexcept>
class Cadena {
public:
explicit Cadena (const size_t longitud = 0, const char cadena = ' ');
Cadena (const Cadena& );
Cadena (const char* );
~Cadena() {delete[] cadena_;}
size_t longitud() const {return longitud_ - 1;}
char* c_str() const {return cadena_;}
Cadena& operator = (const char*);
Cadena& operator = (const Cadena&);
Cadena& operator += (const Cadena&);
char operator [] (int pos) const {return cadena_[pos];}
char& operator [] (int pos) {return cadena_[pos];}
char at(size_t) const throw (std::out_of_range);
char& at(size_t) throw (std::out_of_range);
// operator char*() const {return (*this).cadena_str();}
Cadena subcadena (int, int) const throw(std::out_of_range);
friend std::ostream& operator << (std::ostream&, const Cadena&);
friend std::istream& operator >> (std::istream&, Cadena&);
private:
char *cadena_;
size_t longitud_;
};
Cadena operator + (const Cadena&, const Cadena&);
bool operator == (const Cadena&, const Cadena&);
bool operator != (const Cadena&, const Cadena&);
bool operator < (const Cadena&, const Cadena&);
bool operator <= (const Cadena&, const Cadena&);
bool operator > (const Cadena&, const Cadena&);
bool operator >= (const Cadena&, const Cadena&);
#endif
Código C++:
Ver original#include <iostream>
#include <cstring>
#include <stdexcept>
#include "cadena.h"
using namespace std;
Cadena::Cadena (const size_t longitud, const char caracter) : longitud_(longitud+1) {
cadena_ = new char[longitud_];
for (size_t i = 0; i < longitud; ++i)
cadena_[i] = caracter;
cadena_[longitud] = '\0';
}
Cadena::Cadena (const Cadena &cadena1) : longitud_(cadena1.longitud() + 1){ // <------- AQUÍ ESTABA EL FALLO
cadena_ = new char[longitud_];
strcpy(cadena_
,cadena1.
c_str()); }
Cadena
::Cadena (const char *cadena
) : longitud_
(strlen(cadena
) + 1){ cadena_ = new char[longitud_];
}
Cadena& Cadena::operator = (const char* cadena) {
longitud_
= strlen(cadena
) + 1; cadena_ = new char[longitud_];
return (*this);
}
Cadena& Cadena::operator = (const Cadena &cadena1) {
if (this != &cadena1) {
delete[] cadena_;
if (cadena1.c_str()) {
longitud_ = cadena1.longitud();
cadena_ = new char[longitud_];
strcpy(cadena_
,cadena1.
c_str()); }
else
cadena_ = NULL;
}
return (*this);
}
Cadena& Cadena::operator += (const Cadena &cadena1) {
Cadena cadena2 (longitud() + cadena1.longitud() + 1);
strcpy(cadena2.
cadena_,cadena_
); strcat(cadena2.
cadena_,cadena1.
cadena_); (*this) = cadena2;
return (*this);
}
char Cadena::at(size_t pos) const throw(std::out_of_range) {
if (pos < 0 || pos > longitud())
throw (std::out_of_range("Posicion fuera de rango"));
else if ((*this)[pos] == 0)
throw (std::out_of_range("Posicion inexistente"));
else
return (*this)[pos];
}
char& Cadena::at(size_t pos) throw(std::out_of_range) {
if (pos < 0 || pos > longitud())
throw (std::out_of_range("Posicion fuera de rango"));
else if ((*this)[pos] == 0)
throw (std::out_of_range("Posicion inexistente"));
else
return (*this)[pos];
}
Cadena operator + (const Cadena &cad1, const Cadena &cad2) {
Cadena aux(cad1);
aux += cad2;
return aux;
}
/* Tam_i no puede ser negativo */
Cadena Cadena::subcadena (int pos_i, int tam_i) const throw(std::out_of_range) {
if ((size_t) pos_i < 0 || (size_t) pos_i > longitud() - 1)
throw (std::out_of_range("Posicion inicial fuera de rango"));
if (tam_i < 0 || (size_t) pos_i + tam_i > longitud())
throw (std::out_of_range("Posicion fuera de rango"));
Cadena cadena (tam_i);
size_t i = 0;
for (size_t k = pos_i; k < (size_t) tam_i + pos_i; k++) {
cadena.at(i) = at(k);
i++;
}
return cadena;
}
/**
* strcmp(x,y)
* Si x == y return 0;
* Si x < y return -1;
* Si x > y return 1;
*/
bool operator == (const Cadena &cad1, const Cadena &cad2) {
return !(strcmp(cad1.
c_str(),cad2.
c_str())); }
bool operator != (const Cadena &cad1, const Cadena &cad2) {
return !(cad1 == cad2);
}
bool operator < (const Cadena &cad1, const Cadena &cad2) {
if (strcmp(cad1.
c_str(),cad2.
c_str()) >= 0) return false;
return true;
}
bool operator <= (const Cadena &cad1, const Cadena &cad2) {
return cad1 < cad2 || cad1 == cad2;
}
bool operator > (const Cadena &cad1, const Cadena &cad2) {
if (strcmp(cad1.
c_str(),cad2.
c_str()) <= 0) return false;
return true;
}
bool operator >= (const Cadena &cad1, const Cadena &cad2) {
return cad1 > cad2 || cad1 == cad2;
}
ostream& operator << (ostream &output, const Cadena &c) {
output << c.c_str();
return output;
}
istream& operator >> (istream &input, Cadena &c) {
char* entrada = new char[32];
entrada[0] = '\0';
input.width(32);
input >> entrada;
c = entrada;
delete[] entrada;
return input;
}
EDIT:: Vale ya encontre el fallo, retoco el codigo faltaba un +1 en el segundo constructor de la cadena T.T
Mil gracias por ayudarme
Ya que estoy me gustaría preguntar, la función externa mostrar_carro, deberá mostrar o imprimir el contenido del carro de compra de un usuario en
un flujo de salida, mi duda es
¿Un flujo de salida es un tipo de dato ofstream?