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

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

Восстановить пароль Регистрация
 
Suares
0 / 0 / 0
Регистрация: 28.02.2013
Сообщений: 106
30.11.2013, 13:48     Возврат моего объекта List из функции #1
Ребята, вот есть у меня такой 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;
}
Буду благодарен за любую подсказку
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
MrCold
851 / 749 / 71
Регистрация: 11.01.2012
Сообщений: 1,942
30.11.2013, 16:27     Возврат моего объекта List из функции #2
Ошибка где-то в другом месте, в коде который вы не привели
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;
    }
Suares
0 / 0 / 0
Регистрация: 28.02.2013
Сообщений: 106
30.11.2013, 17:41  [ТС]     Возврат моего объекта List из функции #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
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() остается прежней.
MrCold
851 / 749 / 71
Регистрация: 11.01.2012
Сообщений: 1,942
01.12.2013, 20:48     Возврат моего объекта List из функции #4
Цитата Сообщение от Suares Посмотреть сообщение
Если будет время у Вас, можете пересмотреть мой код.

Не по теме:

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



У вас нет конструктора копии.
И параметры шаблона нужно явно прописывать(хотя это в данном случае и не вызывает ошибки )
Цитата Сообщение от Suares Посмотреть сообщение
List& operator=(const List& l);
C++
1
List<T>& operator=(const List<T>& l);
Yandex
Объявления
01.12.2013, 20:48     Возврат моего объекта List из функции
Ответ Создать тему
Опции темы

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