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

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

Войти
Регистрация
Восстановить пароль
 
Spliver
Сообщений: n/a
#1

Обращение к структуре в классе с выделением памяти - C++

16.09.2011, 18:37. Просмотров 484. Ответов 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
class Components {
    struct  comps{ // -- База компонентов
        char name[50];
    };
    comps  *components;
 
    int ReadComponents();
    int ReadProducts();
};
 
 
int Components::ReadProducts() {
    int b = ReadComponents();
 
    printf ("Результат: %s",components[5].name);
    // Выводится полная фигня, такое ощущение, что память выделяется только 
        //   в пределах метода, а после уничтожается
}
 
int Components::ReadComponents() {
    comps  *components = (comps*)malloc(sizeof(comps)*10);
    strcpy(components[5].name,"Prostotak");
}
и
C++
1
2
3
4
int main(int argc, char **argv) {
    Components components;
    int a = components.ReadProducts();
}
Ожидаемый ответ работы программы: Prostotak
Однако выводится полная ерунда...

Похоже на то, что метод ReadComponents выделяет память, отрабатывает верно и после завершения эту память освобождает, таким образом к Components::ReadProducts возвращается полная ерунда, которую он и выводит.

Объясните пожалуйста, как правильно выделить память или где это сделать, чтобы программа отработала верно.
Заранее спасибо за помощь.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.09.2011, 18:37
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Обращение к структуре в классе с выделением памяти (C++):

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

Проблемы с выделением памяти - C++
Здравствуйте. Есть контейнер QList <Node *> В Node свой QList <Node *>. Строю программное дерево разбора выражение. На небольших...

ошибка с выделением памяти - C++
выдает ошибку в выделении памяти. никто не подскажет почему? если что -задача звучит так примерно вводим веественные числа пока не...

Проблема с выделением памяти - C++
Всем привет! Нужна помощь. Создаю класс и при компиляции возникает ошибка. Не пойму причину. Помогите пожалуйста. Конструктор должен...

Не работает обращение к структуре - C++
#include <iostream> #include <string> using namespace std; struct VA { string Name; string Adres; string...

Задача на строки с выделением памяти - C++
Добрый вечер, помогите с задачкой Выводит на экран только строки, состоящие из заданного количества слов. Возвращает количество прочих...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
OstapBender
583 / 521 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
16.09.2011, 19:02 #2
Цитата Сообщение от Spliver Посмотреть сообщение
// Выводится полная фигня, такое ощущение, что память выделяется только
// в пределах метода, а после уничтожается
так и есть, вы создали локалную переменную comps *components

надо писать просто
C++
1
components = (comps*)malloc(sizeof(comps)*10);
и да, почему не new ?
0
insolent
826 / 347 / 15
Регистрация: 30.01.2009
Сообщений: 1,204
16.09.2011, 19:15 #3
Spliver, в не void ф-ция всегда должен быть return. Из вне можно обращаться только к public методам или полям класса..
Так более правильнее..
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
class Components {
    struct  comps{ // -- База компонентов
        char name[50];
    };
    comps  *components;
 
public:
    int ReadComponents();
    int ReadProducts();
};
 
 
int Components::ReadProducts() {
    int b = ReadComponents();
 
    printf ("Результат: %s",components[5].name);
    // Выводится полная фигня, такое ощущение, что память выделяется только 
    //   в пределах метода, а после уничтожается
    return 0;
}
 
int Components::ReadComponents() {
    components = (comps*)malloc(sizeof(comps)*10);
    strcpy(components[5].name,"Prostotak");
 
    return 0;
}
0
Spliver
Сообщений: n/a
16.09.2011, 19:27 #4
Цитата Сообщение от OstapBender Посмотреть сообщение
так и есть, вы создали локалную переменную comps *components

надо писать просто
C++
1
components = (comps*)malloc(sizeof(comps)*10);
и да, почему не new ?
Все заработало Большое спасибо!
Я портирую эту программу с C, еще не до конца разобрался с new

To insolent: конечно я везде ставлю return, просто здесь я делал вырезку кода, чтобы понятнее объяснить свою проблему
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.09.2011, 19:27
Привет! Вот еще темы с ответами:

Строки с выделением динамической памяти - C++
Привет всем! Помогите решить вот такую задачу: Ввести две строки. Определить совпадение их слов (Первое слово 1 строки сравнить с первым...

Работа со строками и выделением памяти - C++
Задание написать класс строк (что-то типа String). #define MAX 100 class ascii { private: char* str; int len; ...

Как обраиться к структуре в классе? - C++
как обраиться к структуре в классе. к указателю и массиву. #include <iostream> using namespace std; class cd { ...

Обращение динамического массива к структуре - C++
Подскажите как заполнить данные дин.массива по структуре. Задание просто создать дин.массив через new struct Car { std::string...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
16.09.2011, 19:27
Ответ Создать тему
Опции темы

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