Guest User

Untitled

a guest
Mar 24th, 2018
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.16 KB | None | 0 0
  1. #pragma once
  2. #include <iostream>
  3.  
  4. namespace David {
  5.  
  6. class Cadena {
  7. private:
  8. char* bufer;
  9. size_t tamanio;
  10.  
  11. size_t obtenerLongitud(const char* cadena) {
  12. size_t longitud = 0;
  13. for (longitud = 0; cadena[longitud] != ''; ++longitud);
  14. ++longitud;
  15. return longitud;
  16. }
  17.  
  18. void borrarBufer() {
  19. delete[] bufer;
  20. bufer = nullptr;
  21. }
  22.  
  23. void ajustar(size_t longitud) {
  24. char* cadenaTemporal = new char[longitud + 1];
  25. if (bufer != nullptr) {
  26. for (size_t i = 0; i < tamanio; ++i) {
  27. cadenaTemporal[i] = bufer[i];
  28. }
  29. }
  30. borrarBufer();
  31. bufer = cadenaTemporal;
  32. cadenaTemporal = nullptr;
  33. tamanio = longitud + 1;
  34. }
  35.  
  36. public:
  37. Cadena(const char* cadena) {
  38. tamanio = obtenerLongitud(cadena);
  39. bufer = new char[tamanio];
  40. for (size_t longitud = 0; cadena[longitud] != ''; ++longitud) {
  41. bufer[longitud] = cadena[longitud];
  42. }
  43. bufer[tamanio - 1] = '';
  44. }
  45.  
  46. Cadena() {
  47. tamanio = 0;
  48. bufer = nullptr;
  49. }
  50.  
  51. ~Cadena() {
  52. borrarBufer();
  53. }
  54.  
  55. const char* formaConstante() const {
  56. return static_cast<const char*>(bufer);
  57. }
  58.  
  59. const size_t len() const {
  60. return tamanio - 1;
  61. }
  62.  
  63. char& operator [] (size_t indice) {
  64. if (indice < tamanio)
  65. return bufer[indice];
  66. return bufer[tamanio - 1];
  67. }
  68.  
  69. void operator = (const char* cadena) {
  70. borrarBufer();
  71. tamanio = obtenerLongitud(cadena);
  72. bufer = new char[tamanio];
  73. for (size_t longitud = 0; cadena[longitud] != ''; ++longitud) {
  74. bufer[longitud] = cadena[longitud];
  75. }
  76. bufer[tamanio - 1] = '';
  77. }
  78.  
  79. friend std::ostream& operator << (std::ostream& salida, const Cadena& cadena) {
  80. for (size_t longitud = 0; cadena.formaConstante()[longitud] != ''; ++longitud) {
  81. salida << cadena.formaConstante()[longitud];
  82. }
  83. return salida;
  84. }
  85.  
  86. friend void operator >> (std::istream& entrada, Cadena& cadena) {
  87. if(cadena.bufer != nullptr) cadena.borrarBufer();
  88. char letra = ' ';
  89. size_t longitud = 0;
  90. while (letra != 'n') {
  91. entrada >> std::noskipws >> letra;
  92. cadena.ajustar(longitud);
  93. cadena.bufer[longitud] = letra;
  94. ++longitud;
  95. }
  96. cadena.bufer[longitud - 1] = '';
  97. }
  98. };
  99.  
  100. }
  101.  
  102. David::Cadena example("oh oh");
  103. std::cin >> example;
  104.  
  105. const size_t len() const {
  106. return tamanio;
  107. }
  108.  
  109. Cadena my_copy(other.formaConstante())
  110.  
  111. void swap(Cadena & other) {
  112. std::swap(tamino, other.tamino);
  113. std::swap(bufer, other.bufer);
  114. }
  115.  
  116. Cadena& operator=(const char* cadena) {
  117. Cadena temporary(cadena);
  118. swap(cadena);
  119. return *this;
  120. }
Add Comment
Please, Sign In to add comment