Форум программистов, компьютерный форум CyberForum.ru

Динамическая строка и перегрузка операций - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 22, средняя оценка - 4.68
Barok
7 / 7 / 0
Регистрация: 07.12.2010
Сообщений: 49
10.12.2010, 13:15     Динамическая строка и перегрузка операций #1
Общая постановка. Пользовательский класс String должен содержать необходимые элементы-данные, которые создаются в динамической области памяти.
Конструктор для создания строк: String (…);
Деструктор: ~String();
Метод ввода исходной строки: Set();
Метод печати: void print(…);
Код методов – вне пространства определения класса. Программа иллюстрирует прямой и косвенный способы обращения к методам.
Ввести с клавиатуры строку символов S1. Признак окончания ввода строки – нажатие клавиши «Ввод». Программа должна содержать перегруженную операцию «=», использование которой скопирует str в str_return .
Условие:
Если длина L четная, то удаляются 2 первых и 2 последних символа.

Что-то совсем закопался в коде, в частности в самой этой перегрузке операций... Направте пожалуйста меня в нужное русло, укажите на ои существенные ошибки:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#include <iostream>
#define SIZE 255
#include <cstring>
#include <stdlib>
#include <stdio>
#include <istream>
using namespace std;
 
class String{
  char *str;
  char *str_return;
public:
  String();
  String(char*);
  ~String();
  Set(char*);
  friend void print(String&);
  String & operator=(String&);
};
String::String(){
  str=new char[SIZE];
  str[0]='\0';
  str_return=new char[SIZE];
  str_return[0]='\0';
};
String::String(char *s){
  str=new char[SIZE];
  strcpy(str,s);
  str_return[0]='\0';
};
String::~String(){
  delete str;
  cout<<"..destructor has been called"<<endl;
};
void String::Set(char* s){
  for(int=0;i<strlen(s);i++)
    str[i]=s[i];
  str[i]='\0';
};
String &String::operator=(String& obj){
  int j=0;
  if ((strlen(obj.str)%2)==0){
    for(unsigend i=2;i<(strlen(obj.str)-2);i++){
      obj.str_return[j]=obj.str[i];
      j++;
    }
    obj.str_return[j]='\0';
  }
  else
    cout<<"Ne chetnoe"<<endl;
};
 
void print(String& obj){
  cout<<obj.str<<" "<<obj.str_return<<endl;
};
 
void main(void){
  char s[256];
  cout<<" Vvedite stroku i nazmite ENTER:"<<endl;
  cin.getline(s,256);
  String str(s);
  str.Set(s);
  Sring *str_return=new String();
  str_return=str;
  print(str_return);
  std::cin.ignore();
  std:cin.get();
};
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.12.2010, 13:15     Динамическая строка и перегрузка операций
Посмотрите здесь:

C++ Перегрузка операций
Динамическая строка и перегрузка операций C++
C++ Перегрузка операций!
C++ Перегрузка операций
Перегрузка операций C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Barok
7 / 7 / 0
Регистрация: 07.12.2010
Сообщений: 49
12.12.2010, 15:07  [ТС]     Динамическая строка и перегрузка операций #2
вот собсно сам посидел пару дней, переделал. Всё практически работает, единственное в конце если кол-во элементов не четное либо меньше пяти, после вывода сообщения выскакивает ошибка. Можете подсказать в чем проблема?
Динамическая строка и перегрузка операций

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#include <iostream>
#include <cstring>
using namespace std;
 
class String{
private:
    char *m_Str; // указатель на строку с нулём на коце
    int *L; // указатель на размер строки
 
    void New( const char *str ); // выделение памяти
    void Del(); // удаление памяти
 
public:
    String(); // конструктор по умолчанию
    explicit String(const String &str); // конструктор копирования
    String( const char * str ); // дополнительный конструктор
    ~String(); // деструктор
 
    void Set();
    void Print();
    String & operator=( const String & str );
};
 
void String::New( const char *str ){
    int size = strlen(str);
    m_Str = new char[size+1]; // массив для строки символов
    L = new int(size); // длинна строки
    strcpy( m_Str, str ); // копируем строку
}
void String::Del(){
    delete [] m_Str;
    delete L;
}
 
String::String(){ New("\0"); }
String::String(const char *str){ New(str); }
String::String(const String &str){ New(str.m_Str); }
String::~String(){ Del(); }
 
void String::Print(){ std::cout << m_Str << '\n'; }
void String::Set(){
    Del();
    char tmp[1000];
    cin.getline( tmp, 1000 );
    cin.sync();
    New(tmp); 
}
 
String & String::operator =(const String &str){
    int j=0;
    Del();
    char *tmp=new char[*str.L];
    if(*str.L%2==0&&*str.L>5){       //проверка условия четности
      for (int i=2; i<*str.L-2;i++){
        tmp[j]=str.m_Str[i];
        j++ ;
      }
      tmp[j]='\0';
      New(tmp);
    }
    else
      cout<<"Ne 4etnoe ili malenkaya stroka"<<endl;
    delete [] tmp;
    return *this;
};
 
 
int main(){
    String s1, s2;
    s1.Set();
    s2 = s1; // выполнение задания
    s2.Print();
    getchar(); // пауза
    return 0;
}
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
12.12.2010, 15:08     Динамическая строка и перегрузка операций #3
Цитата Сообщение от Barok Посмотреть сообщение
// указатель на размер строки
Скажите, а зачем эту переменную делать указателем?
Barok
7 / 7 / 0
Регистрация: 07.12.2010
Сообщений: 49
12.12.2010, 15:19  [ТС]     Динамическая строка и перегрузка операций #4
Цитата Сообщение от fasked Посмотреть сообщение
Скажите, а зачем эту переменную делать указателем?
да какая разница собсно, или я буду везде использовать функцию strlen, или в одном месте присвою переменной L длину строки в виде указателя, разве суть задачи изменится? меня больше интересует вопрос почему ошибка выскакивает. Если я не прав, то попровьте меня, потому что я только-только начал изучать С++ и мало что тут понимаю.
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
12.12.2010, 15:58     Динамическая строка и перегрузка операций #5
Цитата Сообщение от Barok Посмотреть сообщение
да какая разница собсно, или я буду везде использовать функцию strlen, или в одном месте присвою переменной L длину строки в виде указателя
да я не понимаю, зачем под одно число выделять память.
можно же просто int L использовать.
Цитата Сообщение от Barok Посмотреть сообщение
Всё практически работает, единственное в конце если кол-во элементов не четное либо меньше пяти, после вывода сообщения выскакивает ошибка. Можете подсказать в чем проблема?
Ну это потому что Вы очищаете память, а потом пытаетесь вывести результат на экран. А выводить то собственно и нечего.
Цитата Сообщение от Barok Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
String & String::operator =(const String &str){
    Del(); // здесь очистили память
 
    if(*str.L%2 == 0 && *str.L > 5) { 
          // ... 
          // здесь выделили 
          New(tmp);
    }
    else // а здесь не выделили
        cout<<"Ne 4etnoe ili malenkaya stroka"<<endl;
 
 return *this;
};
[quote=Barok;1193623]
C++
1
2
3
s1.Set();
 s2 = s1; // выполнение задания
 s2.Print();[
/quote]
а здесь попытались вывести на экран удаленный участок памяти

для решения можно вставить такой костыль:
в операторе присваивания в случае elsr добавить New("");

Работать должно, но вообще это не очень правильное решение. По-хорошему надо все переписать
Barok
7 / 7 / 0
Регистрация: 07.12.2010
Сообщений: 49
12.12.2010, 16:25  [ТС]     Динамическая строка и перегрузка операций #6
Спасибо за пояснения. Вот изменённый код, где L не указатель. В else применил New("..."). Плюс результат выводится в файл

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#include <iostream>
#include <cstring>
#include <fstream>
using namespace std;
 
class String{
private:
    char *m_Str; // указатель на строку с нулём на коце
    int L; // указатель на размер строки
    void New( const char *str ); // выделение памяти
    void Del(); // удаление памяти
 
public:
    String(); // конструктор по умолчанию
    explicit String(const String &str); // конструктор копирования
    String( const char * str ); // дополнительный конструктор
    ~String(); // деструктор
    void Set();
    void Print();
    void ofile();
    String & operator=( const String & str );
};
 
void String::New( const char *str ){
    int size = strlen(str);
    m_Str = new char[size+1]; // массив для строки символов
    L = size; // длинна строки
    strcpy( m_Str, str ); // копируем строку
}
void String::Del(){
    delete [] m_Str;
  ;
}
 
String::String(){ New("\0"); }
String::String(const char *str){ New(str); }
String::String(const String &str){ New(str.m_Str); }
String::~String(){ Del(); }
 
void String::Print(){
  cout << m_Str << '\n';
}
void String::Set(){
    Del();
    char tmp[1000];
    cin.getline( tmp, 1000 );
    cin.sync();
    New(tmp); 
}
void String::ofile(){
  ofstream file;
  file.open("text.txt",ios::app);
  file<<m_Str<<endl;
  file.close();
}
String & String::operator =(const String &str){
    int j=0;
    Del();
    char *tmp=new char[str.L];
    if(str.L%2==0&&str.L>5){       //проверка условия четности
      for (int i=2; i<str.L-2;i++){
        tmp[j]=str.m_Str[i];
        j++ ;
      }
      tmp[j]='\0';
      New(tmp);
    }
    else
      New("Ne 4etnoe ili malenkaya stroka");
    delete [] tmp;
    return *this;
};
 
 
int main(){
    String s1, s2;
    s1.Set();
    s1.ofile();
    s2 = s1; // выполнение задания
    s2.Print();
    s2.ofile();
    getchar(); // пауза
    return 0;
}
Yandex
Объявления
12.12.2010, 16:25     Динамическая строка и перегрузка операций
Ответ Создать тему
Опции темы

Текущее время: 17:52. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru