klasa string, operator <<, c++

0

Hej. Problem polega na tym, ze do poki nie dodam do funkcji main elementu: "B = "Jest i czwarty.";", to wszystko ladnie dziala (zaznaczam ze wlasnie potrzebuje tego elementu :) ). Po dodaniu program przestaje dzialac, w ogole nic. Podejrzewam ze problem pochodzi od przeciazenia operatora <<, "String String::operator <<(char *str3)", poniewaz visual mi 'wykryl', ze cos sie psuje od elementu "string=new char[len];", wlasnie w tym przeciazeniu. Calkowicie nie mam pojecia co moze to powodowac.

#include <conio.h>
#include <iostream>

using namespace std;

class String
{
    char *string;
    int len;

public:
    String(void) 
    { 
        len=1;
         string=new char[len+1];
        string[0]=0;    
    }

    String(int n) 
    { 
        len = n;
        string=new char[len+1];
        string[0]=0;
    }

    String(char *s)
     {
        len = strlen(s);
        string = new char[len+1];
        strcpy(string,s);
    }

    String(String& str) 
    { 
        len=str.len; 
        string=new char[len+1]; 
         strcpy(string,str.string);
    }

    void print(void)
    {
        cout << string ;
    }

    ~String()
    {
        delete []string;
    }
    String& operator =(String &str);
     String operator <<(char *str3);
    friend String operator +(String str1,String str2);
};


String String::operator <<(char *str3)
{
    String temp(len);
    strcpy(temp.string,string);
     delete []string;
    len=len+strlen(str3)+1;
    string=new char[len];
    strcpy(string,temp.string);
    strcat(string,str3);
    return string;
}    

String& String::operator =(String &str)
 {
    delete []string;
    string=new char[str.len+1];
    strcpy(string,str.string);
    return *this;
}

String operator +(String str1,String str2)
    {
        String temp(str1.len+str2.len+1);
         strcpy(temp.string,str1.string);
        strcat(temp.string,str2.string);
        return temp;
    }    


void main(void)
{  
    String A("Pierwszy element,"),B;
     A << " drugi ";
    B = A + "i trzeci. ";
B = "Jest i czwarty.";
    B.print();    
    
    _getch();
    return;
}
0
    String(const String &str) 
    String &operator=(const String &str); //wewnątrz nie zmieniasz len WTF?

    String operator +(const String &str1,const String &str2) const // wewnątrz przydzielasz za dużo pamięci, +1 doda się wewnątrz konstruktora

Dodatkowo:

  • wywal: String(void) i tak zrobiony bez sensu.
  • zamień: String(int n=0) to będzie pełnić role wywalonego niepoprawnego domyślnego
0

Dokladnie tak samo mnie wywala jak przedtem po zmianach : (

0
class String
{
    char *string;
    int len;

public:

    String(int n=0) 
    { 
         len = n;
        string=new char[len+1];
        string[0]=0;
    }

    String(char *s)
    {
        len = strlen(s);
        string = new char[len+1];
		
        strcpy(string,s);
    }

    String(const String& str) 
    { 
        len=str.len; 
        string=new char[len+1]; 
        strcpy(string,str.string);
    }

    void print(void)
    {
        cout << string ;
     }

    ~String()
    {
        delete []string;
    }

    String& operator =(const String &str);
    String operator <<(char *str3);
    friend String operator +(const String str1,const String str2);

};


String String::operator <<(char *str3)
{
    String temp(len);
    strcpy(temp.string,string);
    delete []string;
    len=len+strlen(str3)+1;
    string=new char[len];
    strcpy(string,temp.string);
     strcat(string,str3);
    return string;
}    

String& String::operator =(const String &str)
{
    String temp(str.len);
    strcpy(temp.string,str.string);
    delete []string;
    string=new char[str.len+1];
     strcpy(string,temp.string);

    return *this;
}

String operator +(const String str1,const String str2) 
    {
        String temp(str1.len+str2.len+1);
        strcpy(temp.string,str1.string);
        strcat(temp.string,str2.string);
         return temp;
    }


void main(void)

{
    String A("Pierwszy wyraz,"),B;
     A << " drugi ";
    B = A + "i trzeci.";
	B << " Jest i czwarty.";
    B.print();   

    _getch();
    return;
}
1

Zastosowałeś tylko polowe z tego co powiedziałem, operator << to zupełny koszmar. Przerobione na w miarę poprawne:

#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;

class String
  {
   size_t len; 
   char *string;
   public:
   String(size_t len=0):len(len),string(new char[len+1]) {  memset(string,0,len+1); }
   String(const char *s):len(strlen(s)),string(new char[len+1]) { memcpy(string,s,len+1); }
   String(const String &str):len(str.len),string(new char[len+1]) { memcpy(string,str.string,len+1); }
   ~String() { delete []string; }
   ostream &print(ostream &s)const { return s<<string;}
   void swap(String &str) { ::swap(string,str.string); ::swap(len,str.len); }
   String &operator=(const String &str);
   String operator+(const String &str2)const;
   String &operator<<(const char *str3);
  };
inline ostream &operator<<(ostream &s,const String &str) { return str.print(s); }

String &String::operator=(const String &str)
  {
   String temp(str);
   swap(temp);
   return *this;
  }

String String::operator+(const String &str)const
  {
   String temp(len+str.len);
   memcpy(temp.string,string,len);
   memcpy(temp.string+len,str.string,str.len+1);
   return temp;
  }
 
String &String::operator<<(const char *str)
  {
   String temp=*this+String(str);
   swap(temp);
   return *this;
  }    
 
int main()
  {
   String A("Pierwszy wyraz,"),B;
   A<<" drugi ";
   B=A+"i trzeci.";
   B<<" Jest i czwarty.";
   cout<<B<<endl;
   cin.get(); 
   return 0;
  }

1 użytkowników online, w tym zalogowanych: 0, gości: 1