С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 22, средняя оценка - 4.68
Barok
7 / 7 / 0
Регистрация: 07.12.2010
Сообщений: 49
#1

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

10.12.2010, 13:15. Просмотров 3065. Ответов 5
Метки нет (Все метки)

Общая постановка. Пользовательский класс 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();
};
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.12.2010, 13:15
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Динамическая строка и перегрузка операций (C++):

Динамическая строка и перегрузка операций - C++
Всем доброго дня!!!Если есть минутка, помогите сделать эти задания!буду очень благодарен!! Вот сама задача!!!! 1. Длина L четная, то...

Класс динамическая строка и перегрузка операций - C++
Форумчане, привет :) Нужна помощь!:help: Не могу найти, точнее их ликвидировать ошибки.. :( Общая постановка. Пользовательский класс...

"динамическая строка" и перегрузка операций (класс) - C++
Добрый день! Прошу помочь написать,подсказать,что исправить в программе по заданию: Пользовательский класс String должен содержать...

Перегрузка операций - C++
C++ Перегрузка операций.. Помоги написать прогу Определить класс для работы с квадратной матрицей. Получить величину к одним из...

Перегрузка операций. - C++
Предусмотреть ввод исходных данных с клавиатуры, файла и используя датчик случайных чисел. Написать тестовую программу. Построить класс,...

Перегрузка операций - C++
Добрый день форумчане, помогите решить задачку Перегрузить 8 операторов для класса Вот пример класса class Money{ unsigned long...

5
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;
}
0
fasked
Эксперт С++
4952 / 2532 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
12.12.2010, 15:08 #3
Цитата Сообщение от Barok Посмотреть сообщение
// указатель на размер строки
Скажите, а зачем эту переменную делать указателем?
0
Barok
7 / 7 / 0
Регистрация: 07.12.2010
Сообщений: 49
12.12.2010, 15:19  [ТС] #4
Цитата Сообщение от fasked Посмотреть сообщение
Скажите, а зачем эту переменную делать указателем?
да какая разница собсно, или я буду везде использовать функцию strlen, или в одном месте присвою переменной L длину строки в виде указателя, разве суть задачи изменится? меня больше интересует вопрос почему ошибка выскакивает. Если я не прав, то попровьте меня, потому что я только-только начал изучать С++ и мало что тут понимаю.
0
fasked
Эксперт С++
4952 / 2532 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 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("");

Работать должно, но вообще это не очень правильное решение. По-хорошему надо все переписать
1
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;
}
1
12.12.2010, 16:25
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.12.2010, 16:25
Привет! Вот еще темы с ответами:

Перегрузка операций - C++
Данная программа выполянет операции с дробями. Но у меня возникла проблема. Я создал сервисную функцию которая сокращает дробь. Ну дело том...

Перегрузка операций - C++
Не могу понять в чем ошибка. Нужно вводитьномер в формате (123) 456-789 Но почему то только возвращает число 123 #include...

Перегрузка операций - C++
Уважаемые программисты! Помогите новичку! Мне нужно написать программу, в которой реализуется разреженная матрица переменной размерности,...

Перегрузка операций - C++
Задание у меня перегрузить операции: + добавить элемент в множество; * пересечение множеств; int() мощность множества. Вот...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.