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

Конструктор и деструктор в классе - C++

Восстановить пароль Регистрация
 
Алексaндр
 Аватар для Алексaндр
131 / 108 / 5
Регистрация: 04.12.2010
Сообщений: 313
23.07.2012, 11:26     Конструктор и деструктор в классе #1
Решил разобраться в конструкторах и деструкторах. Написал, вроде по такой же структуре как и в учебнике. А комп выдает ошибки в компиляции, связанные с типом главной функции.
Что не так, подскажите...

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
#include <iostream>
#include <cstring>
using namespace std;
 
class String
{
    private:
        char *str;
    public:
        String (char *s) // конструктор
        {
            int length = strlen (s);
            str = new char [length + 1];
            strcpy ( str, s);
        }
        ~String () // деструктор
        {
            cout<< "Delete string\n";
            delete [] str;
        }
        void display ()
        {
            cout<< str<< endl;
        }
}
 
int main() // насчет этой строки все ошибки
{
    String mas = "This is a new mass of words";
    cout << "mas = "; mas.display();
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.07.2012, 11:26     Конструктор и деструктор в классе
Посмотрите здесь:

конструктор и деструктор в C++ C++
C++ Конструктор и деструктор
C++ Конструктор и деструктор
Конструктор инициализации, конструктор копирования, деструктор C++
C++ Конструктор и деструктор
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Intel~lect
 Аватар для Intel~lect
135 / 124 / 2
Регистрация: 03.07.2012
Сообщений: 355
23.07.2012, 11:29     Конструктор и деструктор в классе #2
После класса поставь точку с запятой
C++
1
2
3
4
class String
{
...
};
CheshireCat
Эксперт С++
2907 / 1235 / 78
Регистрация: 27.05.2008
Сообщений: 3,309
23.07.2012, 11:31     Конструктор и деструктор в классе #3
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
#include <iostream>
#include <cstring>
using namespace std;
 
class String
{
    private:
        char *str;
    public:
        String (const char *s)  // <--- вот тут const
        {
            int length = strlen (s);
            str = new char [length + 1];
            strcpy ( str, s);
        }
        ~String ()
        {
            cout<< "Delete string\n";
            delete [] str;
        }
        void display ()
        {
            cout<< str<< endl;
        }
};  // <--- вот тут ;
 
int main()
{
    String mas = "This is a new mass of words";
    cout << "mas = "; mas.display();
    return 0;
}
А теперь сделай следующий шаг: разработай правильный конструктор копирования и оператор =.
Dekio
Фрилансер
Эксперт C++
 Аватар для Dekio
5816 / 1214 / 214
Регистрация: 23.11.2010
Сообщений: 3,378
Записей в блоге: 1
23.07.2012, 11:32     Конструктор и деструктор в классе #4
Цитата Сообщение от Алексaндр Посмотреть сообщение
}

int main()
C++
1
2
3
};
 
int main()
Алексaндр
 Аватар для Алексaндр
131 / 108 / 5
Регистрация: 04.12.2010
Сообщений: 313
23.07.2012, 11:37  [ТС]     Конструктор и деструктор в классе #5
Да... Точно... В книге её нет (

Добавлено через 4 минуты
CheshireCat, всмысле "правильный конструктор копирования" ? Ты про ссылку на константу ?
Dekio
Фрилансер
Эксперт C++
 Аватар для Dekio
5816 / 1214 / 214
Регистрация: 23.11.2010
Сообщений: 3,378
Записей в блоге: 1
23.07.2012, 11:41     Конструктор и деструктор в классе #6
Алексaндр, если самому не сделать конструктор копирования, будет работать конструктор копирования по умолчанию. В данном случае он совершенно не подходит, т.к. использует побитовое копирование данных. После копирования данных через default copy конструктор, строка другого объекта данного класса будет ссылаться на ту же область памяти, что и строка первого объекта. В результате освобождения памяти произойдет утечка.

C++
1
2
3
4
5
String(const String &obj)
{
    str = new char [strlen(obj.str) + 1];
    strcpy(str, obj.str);
}
Алексaндр
 Аватар для Алексaндр
131 / 108 / 5
Регистрация: 04.12.2010
Сообщений: 313
23.07.2012, 12:26  [ТС]     Конструктор и деструктор в классе #7
Dekio, тогда ошибку выбивает "conversion from `const char[28]' to non-scalar type `String' requested"

Не может char в String вбить ?
Dekio
Фрилансер
Эксперт C++
 Аватар для Dekio
5816 / 1214 / 214
Регистрация: 23.11.2010
Сообщений: 3,378
Записей в блоге: 1
23.07.2012, 12:31     Конструктор и деструктор в классе #8
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
#include <iostream>
#include <cstring>
using namespace std;
 
class String
{
    private:
        char *str;
    public:
        String (const char *s)
        {
            int length = strlen (s);
            str = new char [length + 1];
            strcpy ( str, s);
        }
        String(const String &obj)
        {
            str = new char [strlen(obj.str) + 1];
            strcpy(str, obj.str);
        }
        ~String ()
        {
            cout<< "Delete string\n";
            delete [] str;
        }
        void display ()
        {
            cout<<str<<endl;
        }
        //допишем функцию для вывода адреса строки
        void showAdr()
        {
           cout<<&str<<endl;
        }
}; 
 
int main()
{
    String mas = "This is a new mass of words";
    cout << "mas = "; mas.display();
    String newStr = mas;
    mas.showAdr();
    newStr.showAdr();
    return 0;
}
http://liveworkspace.org/code/f34036...e5488a035efd5e
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
23.07.2012, 13:32     Конструктор и деструктор в классе #9
Насколько мне известно, это потому, что :
C++
1
2
3
4
5
6
7
8
9
10
11
String (const char *s)
        {
            int length = strlen (s);
            str = new char [length + 1];
            strcpy ( str, s);
        }
        String(const String &obj)
        {
            str = new char [strlen(obj.str) + 1];
            strcpy(str, obj.str);
        }
Данная конструкция приводит твою строку "..." к типу String, а затем передает уже ссылку на неё в конструктор копирования (здесь оно второй по счету)
Jupiter
23.07.2012, 13:37
  #10

Не по теме:

Цитата Сообщение от nexen Посмотреть сообщение
int length = strlen (s);
Алексaндр, nexen, strlen возвращает не int и не стоит этим пренебрегать!

Алексaндр
 Аватар для Алексaндр
131 / 108 / 5
Регистрация: 04.12.2010
Сообщений: 313
23.07.2012, 15:34  [ТС]     Конструктор и деструктор в классе #11
Jupiter, не int ??? Мы в лицее всегда в int её вбивали. А чтo она возвращает ?
Jupiter
23.07.2012, 15:37
  #12

Не по теме:

Цитата Сообщение от Алексaндр Посмотреть сообщение
А чт она возвращает ?
это не ко мне, это к документации


nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
23.07.2012, 16:31     Конструктор и деструктор в классе #13
Цитата Сообщение от Jupiter Посмотреть сообщение

Не по теме:


это не ко мне, это к документации

Не по теме:

Какой сайт более информативный? cplusplus или cppreference? Сам пользуюсь первым, но, как мне сказали, на втором информация "по-слаще"

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.07.2012, 16:34     Конструктор и деструктор в классе
Еще ссылки по теме:

C++ С++. Конструктор, деструктор
Конструктор, деструктор C++

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

Или воспользуйтесь поиском по форуму:
Dekio
23.07.2012, 16:34     Конструктор и деструктор в классе
  #14

Не по теме:

nexen, глупый вопрос. Какая разница какой сайт? Информация почти одинакова. Если есть конкретный вопрос, вбиваем в любой из них (хоть в 2 сразу) и смотрим

Yandex
Объявления
23.07.2012, 16:34     Конструктор и деструктор в классе
Ответ Создать тему
Опции темы

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