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

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

Войти
Регистрация
Восстановить пароль
 
Adept88
1 / 1 / 0
Регистрация: 13.09.2011
Сообщений: 19
#1

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

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

Почему не изменяется значение члена класса - C++
Инструкция по запуску: &lt;имя.exe&gt; &lt;inputfilename&gt; &lt;outputfilename&gt; &lt;-s|-i&gt; &lt;-a|-d&gt; В конструкторе (FileSorter.cpp, line 21) я изменяю...

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

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

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

Как построить экземпляр дочернего класса на основе готового экземпляра базового класса? - C++
Если уже есть готовый объект базового класса. Могу я построить экземпляр дочернего на его основе, (напр., получив такой базовый объект...

Создание статической функции класса, которая принимает экземпляр этого же класса как объект - C++
Привет. Есть такой код class Model { public: Model(); Model(int verticesSize, int facesSize); ~Model(); static void...

10
solar_wind
757 / 748 / 42
Регистрация: 06.07.2009
Сообщений: 2,970
Завершенные тесты: 1
05.10.2011, 09:43 #2
Ну правильно, ты смотри что делаешь:
Создаешь статический массив:
C++
1
char word[20];
В первый экземпляр засовываешь указатель на массив (но никак не сам массив)
C++
1
a.m=word;
Во второй экземпляр засовываешь указатель на тот же массив (но никак не сам массив)
C++
1
b.m=word;
Похорошему память под массив должна выделяться не снаружи, а внутри конструктора класса, тогда и получишь для каждого экземпляра свой массив.
1
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;
}
то компилятор ругается. Как выделить память внутри класса?
0
ValeryLaptev
Эксперт С++
1045 / 824 / 48
Регистрация: 30.04.2011
Сообщений: 1,659
05.10.2011, 09:58 #4
Adept88, ругается он потому, что массивы-то присваивать нельзя. А про выделение памяти - читай про new - там много страниц написано, в пост на форуме не влезет...
0
solar_wind
757 / 748 / 42
Регистрация: 06.07.2009
Сообщений: 2,970
Завершенные тесты: 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");
}
1
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;
}
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
05.10.2011, 10:53 #7
Цитата Сообщение от Adept88 Посмотреть сообщение
то компилятор ругается. Как выделить память внутри класса?
Компилятор ругается на присваивание, а не на выделение памяти. Читай ошибки внимательнее.
0
solar_wind
757 / 748 / 42
Регистрация: 06.07.2009
Сообщений: 2,970
Завершенные тесты: 1
05.10.2011, 10:56 #8
Не не....так нельзя....функцию add вообще убери.
Когда ты создал экземпляр класса, у тебя уже есть указатель и память под данные.
Используя get() ты получаешь указатель и теперь можешь работать с данными напрямую.
Если ты присвоишь указателю ссылку на статический массив, то ты потеряешь ту область памяти, которую выделял. Короче читай про использование указателей и про классы!
0
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;
}
0
solar_wind
757 / 748 / 42
Регистрация: 06.07.2009
Сообщений: 2,970
Завершенные тесты: 1
05.10.2011, 11:54 #10
Adept88, Это намного лучше
однако что тебе вернет strlen(x) это вопрос.....под дебагером это будет действительно длина строки, а вот в релизе совсем не факт....так что длину лучше тоже передавай в функцию add.
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 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);}
Замени на +
1
05.10.2011, 11:54
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.10.2011, 11:54
Привет! Вот еще темы с ответами:

Обращение к методам класса через указатель на экземпляр класса - C++
Добрый день. Не могу осилить проблему: Описан абстрактный класс. Описаны наследники этого класса уже без абстрактности. Описан...

Вызов методов класса из двойного указателя на экземпляр класса - C++
Добрый день! Как можно вызвать метод класса по двойному указателя на его экземпляр? struct Point { void getPoint(){}; ...

Как сделать членом класса экземпляр этого же класса - C++
class Operation { public: bool type; //true = operation, false = number char Operator; Operation L_Op; Operation R_Op; ...

Может ли метод класса возвращать экземпляр этого же класса? - C++
такой вопрос, реально что бы функция класса имела тип класса(возвращала класс), то есть типа так: class c1{ c1 f1(); } если да, то...


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

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

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