Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
 Аватар для MrLinder
0 / 0 / 0
Регистрация: 04.10.2014
Сообщений: 41

Уничтожается структура данных в наследуемом классе

24.09.2015, 03:54. Показов 1796. Ответов 21
Метки нет (Все метки)

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

Суть задачи, программа должна считывать слова из файла text.txt. пускай к примеру там 3 слова. без всяких пробелов и прочих символов.

HTML5
1
2
3
TextForTest.
TextForTest2.
TextForTest3.
Затем эти считанные слова должны быть помещены в структурный тип данных.
Собственно вот сам код.

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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#include <iostream>
#include <cstring>
using namespace std;
 
class tempbufers            
{
protected:
    char Bufer[64];
    char *x;            
    string Path;
};
 
class TypesForParsers:public tempbufers
{
protected:
    typedef struct tagword      
    {
        char* path;
    }WORD;
    
    typedef struct tagsentence      
    {
        WORD* sentence;
    }SENTENCE;
};
 
class Load:public TypesForParsers               
{
protected:
    char* path_file;                            
    SENTENCE Pack;  
public: 
    Load(char* p);
    void Read();                                
    void LoadWord(ifstream &file); 
    void ParseFile(ifstream &file, char* r='\0');
};
 
Load::Load(char* p)     
{
    path_file = new char(strlen(p)+1);
    path_file = p;
}
 
void Load::Read()                       
{
    ifstream file((char*)path_file, ios::in);   
    LoadWord(file);     
    file.close();
}
 
void Load::LoadWord(ifstream &file)
{
    Pack.sentence = new WORD[3];
    int j = 0;
        
    while ( j++ < 3)
    { 
        ParseFile(file, Bufer);                                       
 
        cout <<"read:\t\t" << Bufer ;
                
        Path = Bufer;
        Pack.sentence[j].path = new char[Path.length()+1];
        Pack.sentence[j].path = Bufer;
        
        cout << "\tlook: "<< Pack.sentence[j].path << endl;             
    };
    
    for ( int f = 0; f < 3; ++f) 
    {
        cout <<"> "<<Pack.sentence[f].path << endl;
    }
}
    
 
void Load::ParseFile(ifstream &file, char* r )
{
    file >> r;
}
    
int main() 
{
    Load *Config = new Load((char*)"text.txt"); 
           Config->Read();          
}
в 70 строке я делаю проверку что лежит в струтуре в итоге но почему то выводит мусор и самое последнее считынное слово. я так подозреваю что это все мусор а структура уничтожена.. Не могу понять почему так? что так?
Миниатюры
Уничтожается структура данных в наследуемом классе  
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
24.09.2015, 03:54
Ответы с готовыми решениями:

Убрать метод базового класса в наследуемом классе
/** * base */ class baseClass { public function disMe() { echo &quot;I'm here&lt;br&gt;&quot;; } public function foo()...

Полиморфизм. Для чего нужны аргументы базового класса в наследуемом классе?
#include &lt;iostream&gt; #include &lt;string&gt; using namespace std; class Goods { protected: int width; int height; double...

Ошибка "ссылка на нулевой объект" в классе, наследуемом от Fragment
Здравствуйте! Я хочу добавить Twitter api, но не могу это правильно сделать. Из-за этого выдается ошибка ссылки на нулевой объект: ...

21
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
25.09.2015, 10:08
Лучший ответ Сообщение было отмечено MrLinder как решение

Решение

Студворк — интернет-сервис помощи студентам
MrLinder, во-первых, вот тут:
Цитата Сообщение от MrLinder Посмотреть сообщение
C++
1
2
3
4
5
Load::Load(char* p)     //инициализации   в 84 строке подключаем   Load *Config = new Load((char*)"text.txt");  
{
    path_file = new char(strlen(p)+1);   // выделяем память 30 строка   char* path_file;    
    memcpy(path_file, p, strlen(p)+1);  // сохраняем в нее путь к файлу
}
Выделяется память не для массива, а для одного символа char.
Нужно так
C++
1
2
3
4
5
6
Load::Load(char const * p)   
{
    size_t size = strlen(p) + 1;
    path_file = new char[size];  // выделяем память 30 строка   char* path_file;
    memcpy(path_file, p, size);  // сохраняем в нее путь к файлу
}
const не влияет на проблему, но его все равно стоит добавить (как в примере), чтобы избавиться от уродливых приведений типов.
Также к этому конструктору необходим деструктор, который освободит память по указателю path_file. Не забываем, что память для массивов освобождается через delete [].
Во-вторых вот тут в цикле
Цитата Сообщение от MrLinder Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
    while ( j++ < 3)                                // цикл  четия 3 строк
    { 
        ParseFile(file, Bufer);                 // собственнно сам парсер (упрощенный нериально).                                 
 
        cout <<"read:\t\t" << Bufer ;
                
        Path = Bufer;                       // копируем во временную переменную что бы посчитать размер слова
        Pack.sentence[j].path = new char[Path.length()+1];  //выделяем память разщмером с это слово + 0
        memcpy(Pack.sentence[j].path, Bufer, Path.length()+1);  // копируем то что в буфере в нее
        
        cout << "\tlook: "<< Pack.sentence[j].path << endl;     //тут все ок.
    };
неверно инкрементируется счетчик (перед итерацией, а не после). В итоге массив заполняется с 1 индекса до 3, а не с 0, до 2, как должно быть. Индекс 3 - это уже за пределами массива.
Переписать хотя бы так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    while(j < 3)                              
    {
        ParseFile(file, Bufer); 
 
        cout <<"read:\t\t" << Bufer ;
 
        Path = Bufer; 
        Pack.sentence[j].path = new char[Path.length()+1]; 
        memcpy(Pack.sentence[j].path, Bufer, Path.length()+1);
 
        cout << "\tlook: "<< Pack.sentence[j].path << endl;
 
        ++j;
    };
1
 Аватар для MrLinder
0 / 0 / 0
Регистрация: 04.10.2014
Сообщений: 41
27.09.2015, 18:10  [ТС]
DrOffset, да точно. как все просто было)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
27.09.2015, 18:10

Структура в классе
Здраствуйте! Хотел спросить можно ли использовать структуру в классе и соответствует ли оно принципам ООП? #include &lt;iostream&gt; ...

Структура в классе
Здравствуйте, Есть такая вот проблема. Есть желание структурировать программу, выделив отдельные классы. Но в алгоритме есть и структура....

Структура в классе
Добрый день, такой вопрос, есть абстрактный класс. В нем есть структура (без реализации). Есть наследник абстрактного класса. Я пытался в...

Структура в классе, это возможно?
У меня такая проблема, нужно реализовать объект-список. В нем необходимо реализовать методы обеспечивающие полную функциональность списка. ...

Структура в классе (из метода увидеть переменную)
class Records { public: int Count; struct Param { public: __property unsigned int index = {write =...


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

Или воспользуйтесь поиском по форуму:
22
Ответ Создать тему
Новые блоги и статьи
Учебный мини "цифровой двойник" = (Сервер = Java + Flask_питон )+(3D = Гугловскаая 4T nvideo + google colab) +( WMS = Odoo на Docker)
anaschu 07.07.2026
Увидел в требованиях к вакансии создателя имитационных моделей связку (REst + Api + WMS + Anylogic + питон + 3D Nvideo), и решил посмотреть, что это такое. Из этого всего я работал более менее. . .
Море в объективе
kumehtar 06.07.2026
Хотел написать много проникновенных слов, но передумал. Оно само - говорит. Кто слышит тот слышит.
Doom для терминала без стрельбы и монстров. 3D Raycasting на ascii.
dcc0 05.07.2026
Попросил нейронную сеть deepai. org написать рейкастинг 3D с библиотекой ncurses для Linux. Чтобы можно было ходить на стрелочки. Чтобы стены были отрисованы символами. Справилась. Первый вариант. . .
Установка статуса документа по условию
Maks 05.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "НарядПутевка" разработанного в КА2. Задача: в табличной части "Материалы" документа при записи автоматически устанавливать статус. . .
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет. Но обычно это 50 лет и более. Наверное, закисление почвы происходит сезонно в средней. . .
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи. Через несколько переработок от PHP кода к C89 (надеюсь, 89). Но довольно запутанно получилось. Код для Linux. Но если убрать time и то, что с ним. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru