1 / 1 / 0
Регистрация: 13.09.2011
Сообщений: 19
1

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

05.10.2011, 09:40. Показов 787. Ответов 10
Метки нет (Все метки)

Почему значение 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");
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.10.2011, 09:40
Ответы с готовыми решениями:

Почему не изменяется значение члена класса
Инструкция по запуску: &lt;имя.exe&gt; &lt;inputfilename&gt; &lt;outputfilename&gt; &lt;-s|-i&gt; &lt;-a|-d&gt; В конструкторе...

Почему изменяется значение переменной между функциями класса?
Почему-то изменяется значение переменной m(кол-во специальностей) в output_spec. Пробовал в других...

Создать экземпляр одного класса в Main, и передать его в экземпляр другого класса
Добрый день. Подскажите пожалуйста. есть несколько классов-файлов в одном пакете. class one...

Чем отличается экземпляр класса от объекта? Что такое экземпляр объекта?
Добрый день! Чем отличается экземпляр класса от объекта? Что такое экземпляр объекта? Вот...

10
770 / 760 / 59
Регистрация: 06.07.2009
Сообщений: 3,021
05.10.2011, 09:43 2
Ну правильно, ты смотри что делаешь:
Создаешь статический массив:
C++
1
char word[20];
В первый экземпляр засовываешь указатель на массив (но никак не сам массив)
C++
1
a.m=word;
Во второй экземпляр засовываешь указатель на тот же массив (но никак не сам массив)
C++
1
b.m=word;
Похорошему память под массив должна выделяться не снаружи, а внутри конструктора класса, тогда и получишь для каждого экземпляра свой массив.
1
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;
}
то компилятор ругается. Как выделить память внутри класса?
0
Эксперт С++
1067 / 846 / 60
Регистрация: 30.04.2011
Сообщений: 1,659
05.10.2011, 09:58 4
Adept88, ругается он потому, что массивы-то присваивать нельзя. А про выделение памяти - читай про new - там много страниц написано, в пост на форуме не влезет...
0
770 / 760 / 59
Регистрация: 06.07.2009
Сообщений: 3,021
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");
}
1
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;
}
0
Делаю внезапно и красиво
Эксперт С++
1312 / 1227 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
05.10.2011, 10:53 7
Цитата Сообщение от Adept88 Посмотреть сообщение
то компилятор ругается. Как выделить память внутри класса?
Компилятор ругается на присваивание, а не на выделение памяти. Читай ошибки внимательнее.
0
770 / 760 / 59
Регистрация: 06.07.2009
Сообщений: 3,021
05.10.2011, 10:56 8
Не не....так нельзя....функцию add вообще убери.
Когда ты создал экземпляр класса, у тебя уже есть указатель и память под данные.
Используя get() ты получаешь указатель и теперь можешь работать с данными напрямую.
Если ты присвоишь указателю ссылку на статический массив, то ты потеряешь ту область памяти, которую выделял. Короче читай про использование указателей и про классы!
0
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;
}
0
770 / 760 / 59
Регистрация: 06.07.2009
Сообщений: 3,021
05.10.2011, 11:54 10
Adept88, Это намного лучше
однако что тебе вернет strlen(x) это вопрос.....под дебагером это будет действительно длина строки, а вот в релизе совсем не факт....так что длину лучше тоже передавай в функцию add.
0
Делаю внезапно и красиво
Эксперт С++
1312 / 1227 / 72
Регистрация: 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);}
Замени на +
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.10.2011, 11:54
Помогаю со студенческими работами здесь

Создать экземпляр метода класса или доступ к методу из экземпляра класса
Всем доброго времени суток!) Уже месяца как 2 не сишарпил и подзабыл...собственно задача такая:...

Как получить ссылку на текущий экземпляр класса внутри этого класса?
Как? Чтобы отрабатывал деструктор! и в нем можно было поиметь этот this ... Идея в том, что пишу...

Создание указателя типа базового класса на экземпляр производного класса
Добрый день! Иногда видел коды, где создавался указатель типа базового класса на объект класса -...

Создать экземпляр класса без явного указания членов класса
Если у меня есть два конструктора, один из которых по умолчанию, а второй явный. Я почему-то не...

Экземпляр класса как входные данные метода другого класса
Можно ли в качестве входных данных метода передать экземпляр метода другого класса? Если да, то как?

Как вместо ссылки на экземпляр класса передать поле класса?
Делаю свою шаблонную функцию для свойств с событиями, при обращении к таким свойствам приходится...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru