Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
0 / 0 / 0
Регистрация: 01.11.2012
Сообщений: 10
1

Ребят, уже запарился, гляньте, что не так!? конструктор копирования и оператор присваивания

19.09.2013, 11:18. Показов 1011. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
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
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
#include <iostream>
using namespace std;
 
 
struct SNode {
      SNode*next;
      int val;
      SNode(){}
      SNode(SNode* ne,int a){val=a; next=ne;}
};
 
class SList
 {
  SNode* head;
  SNode* tail;
    public:
    SList();
    SList(int);
    SList(const SList&); //конструктор копирования
    ~SList();
 
    bool is_empty();
    void add_front(int);
    int remove_front();
    bool find(int);
    int get_nth(int);
    int size();
    void print_slist();
 
    //SList& operator=(const SList&); //опрератор присваивания
};
SList::SList(){
    this->head=new SNode();
    this->tail=head;
}
SList::SList(int a){
    tail=new SNode();
    head=new SNode(tail,a);
}
//+++++++++++++++++++++++++++++
   SList::SList(const SList& t) {
 
   SNode *temp=head;
   while (head!=tail){
   temp=head->next;
   head=temp;
   }
 
}
 //++++++++++++++++++++++++++++++
bool SList::is_empty(){
    return (head==tail)?true:false;
}
void SList::add_front(int a){
    SNode *q=head;
    head=new SNode(q,a);
}
int SList::remove_front(){
    SNode* q=head;
    head=head->next;
    int a=q->val;
    delete q;
    return a;
}
bool SList::find(int a){
    SNode* q=head;
    while(q!=tail)
    {
        if(q->val==a)
            return true;
        else
            q=q->next;
    }
    return false;
}
int SList::get_nth(int a){
    SNode* q=this->head;
    for(int i=0;i<a;i++)
        q=q->next;
    return q->val;
}
int SList::size(){
    SNode *q=head;
    int k=0;
    for(;q!=tail;q=q->next,k++)
        ;
    return k;
}
SList::~SList(){
    while(head!=tail)
    {
        SNode* p=head;
        head=head->next;
        delete p;
    }
    delete tail;
}
 
void SList::print_slist()
{
    int size=this->size();
    for(int i=0;i<size;i++)
    {
        std::cout<<this->get_nth(i)<<' ';
    }
    std::cout<<std::endl;
}/*
SList& SList::operator=(const SList& t)  {
    if(this!=&t){
    delete[];
    p
    }
}*/
 
 
int main()
{ SList L1;
L1.add_front(5);
L1.add_front(9);
L1.add_front(34);
SList L2;
L2.add_front(25);
L1=L2;
 
 
 
 /*
    SList list = new SList;
    for(int val=0;val<5;val++)
    {
        list.add_front(val);
 
    }
    if (!list.is_empty())
    {
        list.print_slist();
 
    }   */
    return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.09.2013, 11:18
Ответы с готовыми решениями:

Конструктор копирования и оператор присваивания
Не понимаю, когда используется один, а когда другой. Написал простой пример с комплексными числами...

Конструктор копирования и оператор присваивания
Есть класс (синтетический, создан для примера) class Object { private: int a; float...

Оператор присваивания через конструктор копирования
Возник такой вопрос. Как перегрузить оператор присваивания для класса через конструктор...

Про конструктор копирования, оператор присваивания
Объясните, пожалуйста, принцип действия конструктора копирования и операции присваивания. На что...

7
347 / 292 / 37
Регистрация: 23.03.2012
Сообщений: 838
19.09.2013, 11:43 2
в конструкторе копирования надо же использовать объект, с которого копируешь Т_Т
0
0 / 0 / 0
Регистрация: 01.11.2012
Сообщений: 10
19.09.2013, 11:56  [ТС] 3
вообще конструктор кривой! Извиняюсь
0
0 / 0 / 0
Регистрация: 01.11.2012
Сообщений: 10
29.09.2013, 11:46  [ТС] 4
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
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
#include <iostream>
using namespace std;
 
 
struct SNode {
      SNode*next;
      int val;
      SNode(){ next = NULL; val = 0;};
      SNode(SNode* ne,int a){val=a; next=ne;}
     
};
 
 
class SList
 {
  SNode* head;
  SNode* tail;
    public:
    SList();
    SList(int);
    SList(const SList&); //конструктор копирования
    ~SList();
 
    bool is_empty();
    void add_front(int);
    int remove_front();
    bool find(int);
    int get_nth(int);
    int size();
    void print_slist();
 
  SList& operator=(const SList&); //оператор присваивания
};
SList::SList(){
    head=new SNode();
    tail=head;
}
SList::SList(int a){
    tail=new SNode();
    head=new SNode(tail,a);
}
//+++++++++++++++++++++++++++++
  SList::SList(const SList& t) {
  
while(t.head!=t.tail)
    {
                    //head=t.head;
                //head=head->next;
                head=new SNode(head,t.head->val);
        }
   tail = t.tail;
 
   }
 //++++++++++++++++++++++++++++++
bool SList::is_empty(){
    return (head==tail)?true:false;
}
void SList::add_front(int a){
    SNode *q=head;
    head=new SNode(q,a);
}
int SList::remove_front(){
    SNode* q=head;
    head=head->next;
    int a=q->val;
    delete q;
    return a;
}
bool SList::find(int a){
    SNode* q=head;
    while(q!=tail)
    {
        if(q->val==a)
            return true;
        else
            q=q->next;
    }
    return false;
}
int SList::get_nth(int a){
    SNode* q=this->head;
    for(int i=0;i<a;i++)
        q=q->next;
    return q->val;
}
int SList::size(){
    SNode *q=head;
    int k=0;
    for(;q!=tail;q=q->next,k++)
        ;
    return k;
}
void SList::print_slist()
{
    int size=this->size();
    for(int i=0;i<size;i++)
    {
        cout<<this->get_nth(i)<<' ';
    }
    cout<<endl;
}
SList::~SList(){
        while(head!=tail)
    {
        SNode* p=head;
        head=head->next;
        delete p;
    }
    delete tail;
}
//*************************************
SList& SList::operator=(const SList& t)  {
        // защита от неправильного самоприсваивания
    if (this == & t) return *this;
    else{
        // освобождаем старую память
    while(head!=tail)
    {
        SNode* p=head;
        head=head->next;
        delete p;
    }
    delete tail;
 
    // присваиваем значения в новой памяти объекту
while(t.head!=t.tail)
    {
                    head=t.head;
                //head=head->next;
                head=new SNode(head,t.head->val);
        }
   tail = t.tail;
  return *this; }
   }
//***************************************************
 
int _tmain(int argc, _TCHAR* argv[])
{
 
    SList L1;
L1.add_front(5);
L1.add_front(9);
L1.add_front(34);
    SList L2;
L2.add_front(25);
L1.print_slist();
L2.print_slist();
 
cout<<"posle = "<<endl;
    L1=L2; // вот тут проблемно
 
L1.print_slist();
L2.print_slist();
 
 
system("pause");
    return 0;
}
0
2686 / 2258 / 244
Регистрация: 03.07.2012
Сообщений: 8,216
Записей в блоге: 1
29.09.2013, 12:16 5
Посмотри в отладчике.
0
249 / 219 / 63
Регистрация: 30.07.2013
Сообщений: 465
29.09.2013, 13:16 6
Ну например
C++
1
while(t.head!=t.tail)
Разве t.head меняется? Нет и не должен, ибо const SList& t.
В общем, неверная логика.
1
0 / 0 / 0
Регистрация: 01.11.2012
Сообщений: 10
29.09.2013, 14:00  [ТС] 7
Как сделать? Помоги! Может так?

SList::SList(const SList& t) {
SNode *q=head;
while(q!=tail)
{
//head=t.head;
//head=head->next;
head=new SNode(q,t.head->val);
}
tail = t.tail;
0
2686 / 2258 / 244
Регистрация: 03.07.2012
Сообщений: 8,216
Записей в блоге: 1
29.09.2013, 14:05 8
Для гаданий есть кофейная гуща , а программист должен понимать, что и зачем он делает .
0
29.09.2013, 14:05
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.09.2013, 14:05
Помогаю со студенческими работами здесь

Очередь, конструктор копирования и перегруженный оператор присваивания
#include &lt;iostream&gt; using namespace std; typedef char type; struct Node { type element;...

Конструктор копирования и оператор присваивания - общая часть, выделять ли в отдельный метод
Как лучше? // конструктор копирования Fraction::Fraction( const Fraction&amp; rhs ) { //...

Нужно ли реализовать также отдельно конструктор копирования, если имеется перегруженный оператор присваивания?
у меня есть класс. и прототип перегруженной операции присваивания some_class&amp;...

Ребят! Гляньте код не могу понять что с ним не так
у меня есть функция, в случае ошибки она должна возвращать эту ошибку. Но ошибка возвращается...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru