Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.66/29: Рейтинг темы: голосов - 29, средняя оценка - 4.66
0 / 0 / 0
Регистрация: 28.02.2013
Сообщений: 106

Возврат моего объекта List из функции

30.11.2013, 13:48. Показов 5616. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Ребята, вот есть у меня такой List:

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
template<class T> 
class List
{
public:
    typedef T* iterator;
    typedef const T* const_iterator;
    typedef T value_type;
 
    List();
    ~List();
 
    void push_front(const T& val);
    void push_back(const T& val);
    void insertAt(size_t id, const T& val);
 
    bool pop_front();
    bool pop_back();
 
    bool isEmpty() const { return first == 0; }
    void print() const;
    void rprint() const;
 
    size_t size() { return last - first; }
 
    List& operator=(const List& l);
 
private:
    Node<T>* first;
    Node<T>* last;
 
    Node<T>* getNewNode(const T& val);
};
И я хочу вернуть List из функции split:

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
int main()
{
    std::string str = "Hello my name is Slava";
 
    List<std::string> l = split(str);
 
    return 0;
}
 
List<std::string> split(std::string& s)
{
    List<std::string> sl;
    std::string::iterator first = s.begin();
 
    while(first != s.end())
    {
        first = std::find_if(first, s.end(), is_not_space);
        std::string::iterator second = std::find_if(first, s.end(), is_space);
 
        if(first != s.end())
            sl.push_back(std::string(first, second));
        first = second;
    }
 
    return sl;
}
В итоге у меня вылазит окошко "прекращение работы программы".
Возможно у меня функция operator= не правильно написана:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
List<T>& List<T>::operator=(const List<T>& l)
{
    if(this != &l)
    {
        Node<T>* current = l.first;
        while(current != 0)
        {
            this->push_back(current->d);
            current = current->next;
        }
    }
 
    return *this;
}
Буду благодарен за любую подсказку
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
30.11.2013, 13:48
Ответы с готовыми решениями:

Создание объекта в функции и возврат объекта из нее
Не могу разобраться с ссылками. Возможно ли вернуть из функции объект созданный в стеке при этом копи конструктор публичный. ...

Возврат Dictionary и List из одной функции
Добрый день! Мне нужно, чтобы функция возвращала один Dictionary&lt;int, мой класс&gt; и один List&lt;string&gt;. Проект под .NET Framework...

Возврат объекта из функции
Здравствуйте. Написал в Code.Blocks на C++ вот такой код (привожу только часть кода, остальное на мой взгляд излишне). class Soldier...

3
873 / 771 / 173
Регистрация: 11.01.2012
Сообщений: 1,942
30.11.2013, 16:27
Ошибка где-то в другом месте, в коде который вы не привели
push_back, is_not_space, isspace пересмотрите у себя
Попытался с имитировать . Работает

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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
#include <iostream>     
#include <algorithm> 
#include <cctype>
#include <string>
#include <functional>
 
template<class T> 
struct Node
{
    T d;
    Node<T>* next;
};
template<class T> 
class List
{
public:
    typedef T* iterator;
    typedef const T* const_iterator;
    typedef T value_type;
 
    List();
  //  ~List();
 
//    void push_front(const T& val);
    void push_back(const T& val);
  //  void insertAt(size_t id, const T& val);
 
  //  bool pop_front();
  //  bool pop_back();
 
    bool isEmpty() const { return first == 0; }
    void print() const;
  //  void rprint() const;
 
    size_t size() { return last - first; }
 
    List& operator=(const List& l);
 
private:
    Node<T>* first;
    Node<T>* last;
 
  //  Node<T>* getNewNode(const T& val);
};
 
template<class T> 
 List<T>::List()
     {
        first = new Node<T>();
    //  first ->d = 10;
        first ->next = NULL;
     }
 template<class T> 
void List<T>::print() const
    {
        Node<T> *current = first;
        while (current)
        {
           std::cout << current->d << ' '  /*<< Curr->Next*/;
           current = current->next;
        }
    }
template<class T> 
void List<T>::push_back(const T& val)
    {
 
 Node<T> *current = first;
    Node<T> *newNode = new Node<T>();
      
 
    newNode->d = val;
    newNode->next = NULL;
 
    while (current->next) {
        current = current->next;
    }    
    current->next = newNode;
    }
 
 
template<class T> 
List<T>& List<T>::operator=(const List<T>& l)
{
    if(this != &l)
    {
        Node<T>* current = l.first;
        while(current != 0)
        {
            this->push_back(current->d);
            current = current->next;
        }
    }
 
    return *this;
} 
List<std::string> split(std::string& s);
int main()
{
    std::string str = "Hello my name is Slava";
 
    List<std::string> l = split(str);
    l.print();
    std::cin.get();
    std::cin.get();
    return 0;
}
 
List<std::string> split(std::string& s)
{
    List<std::string> sl;
    std::string::iterator first = s.begin();
 
    while(first != s.end())
    {
        first = std::find_if(first, s.end(),  std::not1(std::ptr_fun<int, int>(std::isspace)));
        std::string::iterator second = std::find_if(first, s.end(),std::ptr_fun<int, int>(std::isspace));
 
        if(first != s.end())
            sl.push_back(std::string(first, second));
        first = second;
    }
 
    return sl;
}

Цитата Сообщение от Suares Посмотреть сообщение
Возможно у меня функция operator= не правильно написана:
Да забыл
Нужно очищать старый лист


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
template<class T> 
List<T>& List<T>::operator=(const List<T>& l)
{
    if(this != &l)
    {  
        this->clear() ;
        this->first = new Node<T>();
        this->first ->next = NULL;
        Node<T>* current = l.first;
        while(current != 0)
        {
            this->push_back(current->d);
            current = current->next;
        }
    } 
    return *this;
}
C++
1
2
3
4
5
6
7
8
9
10
11
 template<class T> 
void List<T>::clear() 
    {
        while (first)
        {
            Node<T> *current = first;
            first = first->next;
            delete current;
        }
        first = NULL;
    }
1
0 / 0 / 0
Регистрация: 28.02.2013
Сообщений: 106
30.11.2013, 17:41  [ТС]
Если будет время у Вас, можете пересмотреть мой код.

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
#ifndef _NODE_H_
#define _NODE_H_
 
template<class T>
class Node
{
    template<class T> friend class List;
 
public:
    explicit Node(const T& val = T());
    ~Node();
 
    T data() const { return d; }
 
private:
    T d;
 
    Node* next;
    Node* prev;
};
 
template<class T>
Node<T>::Node(const T& val) 
    :d(val), next(0), prev(0) 
{}
 
template<class T>
Node<T>::~Node()
{}
 
#endif
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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
#ifndef _LIST_H_
#define _LIST_H_
 
#include "Node.h"
 
template<class T> 
class List
{
public:
    typedef T* iterator;
    typedef const T* const_iterator;
    typedef T value_type;
 
    List();
    ~List();
 
    void push_back(const T& val);
 
    bool isEmpty() const { return first == 0; }
    void print() const;
 
    size_t size() { return last - first; }
 
    List& operator=(const List& l);
 
private:
    Node<T>* first;
    Node<T>* last;
 
    Node<T>* getNewNode(const T& val);
    void remove();
};
 
template<class T>
Node<T>* List<T>::getNewNode(const T& val)
{
    Node<T> *pNode = new Node<T>(val);
 
    return pNode;
}
 
template<class T>
List<T>::List()
    :first(0), last(0)
{}
 
template<class T>
void List<T>::remove()
{
    if(!isEmpty())
    {
        Node<T>* current = last;
        Node<T>* tmp;
        while(current != 0)
        {
            tmp = current;
            current = current->prev;
            delete tmp;
        }
        first = last = 0;
    }
}
 
template<class T>
List<T>::~List()
{
    remove();
}
 
template<class T>
void List<T>::push_back(const T& val)
{
    Node<T> *pNewNode = getNewNode(val);
 
    if(this->isEmpty())
        first = last = pNewNode;
    else
    {
        last->next = pNewNode;
        pNewNode->prev = last;
        pNewNode->next = 0;
        last = pNewNode;
    }
}
 
template<class T>
void List<T>::print() const
{
    if(this->isEmpty())
        std::cerr << "List is empty" << std::endl;
 
    Node<T>* current = first;
    while(current != 0)
    {
        std::cout << current->d << '\n';
        current = current->next;
    }
    std::cout << std::endl;
}
 
template<class T>
List<T>& List<T>::operator=(const List<T>& l)
{
    if(this != &l)
    {
        remove();
        Node<T>* current = l.first;
        while(current != 0)
        {
            push_back(current->d);
            current = current->next;
        }
    }
 
    return *this;
}
 
#endif
А main() остается прежней.
0
873 / 771 / 173
Регистрация: 11.01.2012
Сообщений: 1,942
01.12.2013, 20:48
Цитата Сообщение от Suares Посмотреть сообщение
Если будет время у Вас, можете пересмотреть мой код.

Не по теме:

Уверен что уже решили проблему, но отвечаю :)



У вас нет конструктора копии.
И параметры шаблона нужно явно прописывать(хотя это в данном случае и не вызывает ошибки )
Цитата Сообщение от Suares Посмотреть сообщение
List& operator=(const List& l);
C++
1
List<T>& operator=(const List<T>& l);
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
01.12.2013, 20:48
Помогаю со студенческими работами здесь

Возврат объекта класса из функции
Имеется следующий код: #include &quot;stdafx.h&quot; #include &lt;iostream&gt; using namespace std; /*Задача: Определить класс список...

Возврат объекта Sprite из функции
Возврат объекта Sprite из функции. Подскажите, пожалуйста (всем привет). Есть функция: sf::Sprite Space() { sf::Image...

Возврат и присвоение объекта из функции без копирования
Возможно ли в С++ вернуть объект (то есть записать данные объекта) напрямую в область памяти, выделенную в функции-приемнике? Наверно...

Возврат элемента по индексу с List
Есть коллекция символов: List&lt;char&gt; txt = new List&lt;char&gt;(); private void button1_Click(object sender, EventArgs e) {...

Возврат generic-объекта
доброго времени суток возник следующий вопрос: имеется шаблонный класс public class Answer&lt;Q extends Question&gt; { ...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru