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

Ошибка, смысл которой не могу расшифровать - C++

Восстановить пароль Регистрация
 
bychevoz
1 / 1 / 0
Регистрация: 16.11.2012
Сообщений: 27
19.11.2012, 03:17     Ошибка, смысл которой не могу расшифровать #1
Первый раз в жизни делаю свой собственный класс (лабораторка по С++)
Задача создать направленный список и реализовать определенные функции
я пока не написал реализацию, а только пообъявлял все и создал cpp-шник где буду все реализовывать, а так же еще один cpp-шник с пустой (пока что) функцией main

вот код объявления класса (class_list.h)
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 <fstream>
#include <string>
 
class List
{
    class Element
    {
        std::string data;            // что хранится
        Element* next;               // указатель на следующий элемент
        Element(std::string _data):  // inline конструктор
            data(_data),
            next(NULL)
            {}                            
        Element():                   // inline конструктор по умолчанию
            data(""),
            next(NULL)
            {}      
        ~Element() { delete this; }  // деструктор
    };
    Element* head;
    Element* current;
    Element* seek(std::string);
public:
    List(); 
    ~List();
    void push(std::string elem); //вставить elem в начало
    void push_back(std::string elem); //вставить elem в конец
    void push_after_first(std::string elem); //вставить elem после первого
    void push_after_each(std::string elem, std::string after); //вставить elem после каждого вхождения after
    std::ofstream* print(const char* filename); //записать в файл. вернуть указатель на файл
}
вот код реализации (тут пока ничего нет) list_realization.cpp

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
#include "class_list.h"
 
List::List()
{
 
}
 
List::~List()
{
 
}
 
void List::push(std::string elem)
{
 
}
 
void List::push_back(std::string elem)
{
 
}
 
void List::push_after_first(std::string elem)
{
 
}
 
void List::push_after_each(std::string elem, std::string after)
{
 
}
 
std::ofstream List::print(const char* filename)
{
 
}
ну и в main.cpp смотреть пока нечего, но вдруг что не так:

C++
1
2
3
4
5
6
7
8
#include "class_list.h"
#include <iostream>
using namespace std;
 
int main()
{
    
}
это список ошибок компиляции (их 2 шт.)

1>ClCompile:
1> main.cpp
1>c:\program files\microsoft visual studio 10.0\vc\include\iostream(10): error C2143: синтаксическая ошибка: отсутствие ";" перед "namespace"
1> list_realization.cpp
1>c:\documents and settings\владелец\рабочий стол\c++\v8\lab8\lab8\list_realization.cpp(4): error C2533: List::{ctor}: конструкторы не разрешены для возвращаемого типа

как я понял это:

1. вообще неясно какая ошибка может быть в файле от разработчиков
2. вообще неясно почему, ведь я все сделал правильно и у моего конструктора и деструктора нету возвращаемого типа
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11815 / 6794 / 769
Регистрация: 27.09.2012
Сообщений: 16,867
Записей в блоге: 2
Завершенные тесты: 1
19.11.2012, 03:20     Ошибка, смысл которой не могу расшифровать #2
После объявление класса List поставьте ;
bychevoz
1 / 1 / 0
Регистрация: 16.11.2012
Сообщений: 27
19.11.2012, 03:32  [ТС]     Ошибка, смысл которой не могу расшифровать #3
охренеть.. работает, спасибо !
есть ли какие-либо замечания по проектированию? правильно ли я сделал, что вложил Element в List?
Peregrin
33 / 33 / 1
Регистрация: 16.11.2012
Сообщений: 59
19.11.2012, 03:37     Ошибка, смысл которой не могу расшифровать #4
Это частая ошибка - не ставить ; в конце .h
Лично я class Element вынес бы отдельно, т.е. классы должны быть каждый в отдельном файле. Но дело ваше, так вроде тоже приемлемо.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11815 / 6794 / 769
Регистрация: 27.09.2012
Сообщений: 16,867
Записей в блоге: 2
Завершенные тесты: 1
19.11.2012, 03:41     Ошибка, смысл которой не могу расшифровать #5
Цитата Сообщение от bychevoz Посмотреть сообщение
C++
1
~Element() { delete this; } // деструктор
Зачем такое?
bychevoz
1 / 1 / 0
Регистрация: 16.11.2012
Сообщений: 27
19.11.2012, 03:44  [ТС]     Ошибка, смысл которой не могу расшифровать #6
ну я смотрю с точки зрения что я работаю например на фирму
мне сказали создать список
я создаю список, и я не хочу чтоб пользователь пользовался типом Element. мне надо чтоб он пользовался списком, а список будет пользоваться Element'ами

Добавлено через 1 минуту
ну деструктор, как я понял, отвечает за то чтоб удалить объект
вот, когда наступает время смерти, он удаляет сам себя, это не логгично?
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11815 / 6794 / 769
Регистрация: 27.09.2012
Сообщений: 16,867
Записей в блоге: 2
Завершенные тесты: 1
19.11.2012, 03:46     Ошибка, смысл которой не могу расшифровать #7
Цитата Сообщение от bychevoz Посмотреть сообщение
вот, когда наступает время смерти, он удаляет сам себя, это не логгично?
У Вас в классе Element нет объектов, которые Вы выделяете в динамической памяти, так что оставьте деструктор пустым.
Peregrin
33 / 33 / 1
Регистрация: 16.11.2012
Сообщений: 59
19.11.2012, 03:47     Ошибка, смысл которой не могу расшифровать #8
Подумал, что class Element в public, только сейчас заметил, что он private. Тогда все логично
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11815 / 6794 / 769
Регистрация: 27.09.2012
Сообщений: 16,867
Записей в блоге: 2
Завершенные тесты: 1
19.11.2012, 03:48     Ошибка, смысл которой не могу расшифровать #9
И еще, сделайте функции удаления элементов, поиска и сортировки.
bychevoz
1 / 1 / 0
Регистрация: 16.11.2012
Сообщений: 27
19.11.2012, 03:52  [ТС]     Ошибка, смысл которой не могу расшифровать #10
поиск, сортировку и удаление в задании не требовали

я вот мучаюсь с деструктором List
что он должен делать? он должен удалить динамически созданные мною Element'ы
но по определению списка, я имею доступ только к одному Element'у в данный момент времени.
ночью голова совсем не думает, помогите, пожалуйста, с примерным алгоритмом для деструктора List
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11815 / 6794 / 769
Регистрация: 27.09.2012
Сообщений: 16,867
Записей в блоге: 2
Завершенные тесты: 1
19.11.2012, 03:55     Ошибка, смысл которой не могу расшифровать #11
но у Вас же есть указатель на следующий элемент списка. А у следующего на следующий(во сморозил) и т.д.
В деструкторе, проходите по всем элементам списка, и удаляете их.
bychevoz
1 / 1 / 0
Регистрация: 16.11.2012
Сообщений: 27
19.11.2012, 04:03  [ТС]     Ошибка, смысл которой не могу расшифровать #12
то есть примерно так?
C++
1
2
3
4
5
6
7
Element* temp;
while (head)
{
temp=head->next;
delete head;
head=temp;
}
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11815 / 6794 / 769
Регистрация: 27.09.2012
Сообщений: 16,867
Записей в блоге: 2
Завершенные тесты: 1
19.11.2012, 04:07     Ошибка, смысл которой не могу расшифровать #13
Цитата Сообщение от bychevoz Посмотреть сообщение
примерно так?
Именно.
bychevoz
1 / 1 / 0
Регистрация: 16.11.2012
Сообщений: 27
19.11.2012, 05:40  [ТС]     Ошибка, смысл которой не могу расшифровать #14
вы не против, если когда я закончу, я выложу готовую работу на критику?

Добавлено через 1 час 31 минуту
всем спасибо, у меня все получилось, но по ходу дела возник вопрос:
вначале, я пытался реализовать print так:
C++
1
2
3
4
5
6
7
8
9
10
11
std::fstream* print(const char* filename)
{
    std::fstream f(filename, ios::out);
    Element* current=head;
    while (current)
    {
        f<<current->data<<'\n';
        current=current->next;
    }
    return &f;
}
а в самой функции main сделать так:
C++
1
L.print("d:\list.txt")->close;
но у меня не получилось, и на этой самой строчке из main() выдавало ошибку времени выполнения, и вылетало
при этом файл таки создавался, но чтото происходило внутри close()

я решил забить и открывать и закрывать файл внутри print, и сделать её void

но в чем же все таки ошибка была?
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
19.11.2012, 05:49     Ошибка, смысл которой не могу расшифровать #15
Цитата Сообщение от bychevoz Посмотреть сообщение
но в чем же все таки ошибка была?
C++
1
return &f;
Возвращаешь указатель на локальную переменную. Вообще для fstream вызывать close() совсем не обязательно, он "сам" это сделает (в деструкторе).
bychevoz
1 / 1 / 0
Регистрация: 16.11.2012
Сообщений: 27
19.11.2012, 06:01  [ТС]     Ошибка, смысл которой не могу расшифровать #16
1. а что сделать, если я хочу вернуть указатель на fstream?
2. смогу ли вернуть просто fstream?
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
19.11.2012, 06:12     Ошибка, смысл которой не могу расшифровать #17
Цитата Сообщение от bychevoz Посмотреть сообщение
1. а что сделать, если я хочу вернуть указатель на fstream?
Создавай fstream извне функции и передавай указатель туда. Обычно для этого используют ссылки, а не указатели.
Цитата Сообщение от bychevoz Посмотреть сообщение
2. смогу ли вернуть просто fstream?
Нет, т.к. копировать потоки нельзя.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.11.2012, 06:13     Ошибка, смысл которой не могу расшифровать
Еще ссылки по теме:

Не могу разобраться в чём ошибка C++
Не могу понять смысл "связные списки" C++
C++ Ошибка в замене предпоследнего столбца первой из строк матрицы n*n, в которой находится максимальный элемент

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

Или воспользуйтесь поиском по форуму:
bychevoz
1 / 1 / 0
Регистрация: 16.11.2012
Сообщений: 27
19.11.2012, 06:13  [ТС]     Ошибка, смысл которой не могу расшифровать #18
ясно, спасибо
Yandex
Объявления
19.11.2012, 06:13     Ошибка, смысл которой не могу расшифровать
Ответ Создать тему
Опции темы

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