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

почему изменяется и первый экземпляр класса - C++

Восстановить пароль Регистрация
 
Adept88
1 / 1 / 0
Регистрация: 13.09.2011
Сообщений: 19
05.10.2011, 09:40     почему изменяется и первый экземпляр класса #1
Почему значение a.m становится равным b.m? Как сделать так, чтобы массив word можно было использовать несколько раз?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
using namespace std;
 
class word
{
    public:
    char *m;
};
word a, b;
 
int main()
{
    char word[20];
    cout<<"Введите слово1: ";
    cin>>word;
    a.m=word;
    cout<<"Введите слово2: ";
    cin>>word;
    b.m=word;
    cout<<a.m<<" "<<b.m;
    system("pause");
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
solar_wind
 Аватар для solar_wind
740 / 731 / 39
Регистрация: 06.07.2009
Сообщений: 2,937
Завершенные тесты: 1
05.10.2011, 09:43     почему изменяется и первый экземпляр класса #2
Ну правильно, ты смотри что делаешь:
Создаешь статический массив:
C++
1
char word[20];
В первый экземпляр засовываешь указатель на массив (но никак не сам массив)
C++
1
a.m=word;
Во второй экземпляр засовываешь указатель на тот же массив (но никак не сам массив)
C++
1
b.m=word;
Похорошему память под массив должна выделяться не снаружи, а внутри конструктора класса, тогда и получишь для каждого экземпляра свой массив.
Adept88
1 / 1 / 0
Регистрация: 13.09.2011
Сообщений: 19
05.10.2011, 09:51  [ТС]     почему изменяется и первый экземпляр класса #3
но если написать

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
class word
{
    public:
    char m[20];
};
word a, b;
 
int main()
{
    char word[20];
    cin>>word;
    a.m=word;
}
то компилятор ругается. Как выделить память внутри класса?
ValeryLaptev
Эксперт C++
1005 / 784 / 46
Регистрация: 30.04.2011
Сообщений: 1,595
05.10.2011, 09:58     почему изменяется и первый экземпляр класса #4
Adept88, ругается он потому, что массивы-то присваивать нельзя. А про выделение памяти - читай про new - там много страниц написано, в пост на форуме не влезет...
solar_wind
 Аватар для solar_wind
740 / 731 / 39
Регистрация: 06.07.2009
Сообщений: 2,937
Завершенные тесты: 1
05.10.2011, 09:58     почему изменяется и первый экземпляр класса #5
Если нигде не ошибся, то так должно работать
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
#include <iostream>
using namespace std;
 
class word
{
    public:
    char *m;
word::word()
{
m=new char[20];
}
word::~word()
{
delete [] m;
}
};
 
 
int main()
{
    word a, b;
    cout<<"Введите слово1: ";
    cin>>a.m;
    cout<<"Введите слово2: ";
    cin>>b.m;
    cout<<a.m<<" "<<b.m;
    system("pause");
}
Adept88
1 / 1 / 0
Регистрация: 13.09.2011
Сообщений: 19
05.10.2011, 10:44  [ТС]     почему изменяется и первый экземпляр класса #6
Спасибо. А как реализовать, запихнув массив в private?

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
#include <iostream>
using namespace std;
 
class word
{
    public:
        word()
        {
            m=new char[20];
        }
        void add(char x[20]) { m = x;}
        char* get() { return m;}
    private:
        char *m;
};
 
 
int main()
{
    word a, b;
    char x[20];
    cout<<"Введите слово1: ";
    cin>>x;
    a.add(x);
    cout<<"Введите слово2: ";
    cin>>x;
    b.add(x);
    cout<<a.get()<<" "<<b.get();
    system("pause");
    return 0;
}
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
05.10.2011, 10:53     почему изменяется и первый экземпляр класса #7
Цитата Сообщение от Adept88 Посмотреть сообщение
то компилятор ругается. Как выделить память внутри класса?
Компилятор ругается на присваивание, а не на выделение памяти. Читай ошибки внимательнее.
solar_wind
 Аватар для solar_wind
740 / 731 / 39
Регистрация: 06.07.2009
Сообщений: 2,937
Завершенные тесты: 1
05.10.2011, 10:56     почему изменяется и первый экземпляр класса #8
Не не....так нельзя....функцию add вообще убери.
Когда ты создал экземпляр класса, у тебя уже есть указатель и память под данные.
Используя get() ты получаешь указатель и теперь можешь работать с данными напрямую.
Если ты присвоишь указателю ссылку на статический массив, то ты потеряешь ту область памяти, которую выделял. Короче читай про использование указателей и про классы!
Adept88
1 / 1 / 0
Регистрация: 13.09.2011
Сообщений: 19
05.10.2011, 11:49  [ТС]     почему изменяется и первый экземпляр класса #9
Спасибо всем, разобрался

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
#include <iostream>
using namespace std;
 
class word
{
    public:
        void add(char *x) { m = new char(strlen(x)-1); strcpy (m, x);}
        char* get() { return m;}
    private:
        char *m;
};
 
 
int main()
{
    word a, b;
    char x[20];
    cout<<"Введите слово1: ";
    cin>>x;
    a.add(x);
    cout<<"Введите слово2: ";
    cin>>x;
    b.add(x);
    cout<<a.get()<<" "<<b.get();
    system("pause");
    return 0;
}
solar_wind
 Аватар для solar_wind
740 / 731 / 39
Регистрация: 06.07.2009
Сообщений: 2,937
Завершенные тесты: 1
05.10.2011, 11:54     почему изменяется и первый экземпляр класса #10
Adept88, Это намного лучше
однако что тебе вернет strlen(x) это вопрос.....под дебагером это будет действительно длина строки, а вот в релизе совсем не факт....так что длину лучше тоже передавай в функцию add.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.10.2011, 11:54     почему изменяется и первый экземпляр класса
Еще ссылки по теме:

C++ Не изменяется значение элемента класса
C++ Классы и объекты в С++, компонента класса и экземпляр класса
Почему изменяется значение переменной между функциями класса? C++

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

Или воспользуйтесь поиском по форуму:
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
05.10.2011, 11:54     почему изменяется и первый экземпляр класса #11
Цитата Сообщение от Adept88 Посмотреть сообщение
void add(char *x) { m = new char(strlen(x)-1); strcpy (m, x);}
Замени на +
Yandex
Объявления
05.10.2011, 11:54     почему изменяется и первый экземпляр класса
Ответ Создать тему
Опции темы

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