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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
bayanist17
0 / 0 / 0
Регистрация: 01.11.2012
Сообщений: 10
#1

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

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

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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.09.2013, 11:18
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Ребят, уже запарился, гляньте, что не так!? конструктор копирования и оператор присваивания (C++):

Конструктор копирования и оператор присваивания - C++
Не понимаю, когда используется один, а когда другой. Написал простой пример с комплексными числами - при компиляции в VS2010 и CodeBlock 10...

Про конструктор копирования, оператор присваивания - C++
Объясните, пожалуйста, принцип действия конструктора копирования и операции присваивания. На что указывает указатель this в этих функциях?...

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

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

Нужно ли реализовать также отдельно конструктор копирования, если имеется перегруженный оператор присваивания? - C++
у меня есть класс. и прототип перегруженной операции присваивания some_class&amp; some_class::operator=(const some_class&amp; some_object); ...

Конструктор копирования, присваивания - C++
Пусть есть класс class some{ private : int a ; }; Перегрузить оператор &quot;=&quot; можно так some&amp; operator=(const some&amp;...

7
Nekto
342 / 287 / 10
Регистрация: 23.03.2012
Сообщений: 838
19.09.2013, 11:43 #2
в конструкторе копирования надо же использовать объект, с которого копируешь Т_Т
0
bayanist17
0 / 0 / 0
Регистрация: 01.11.2012
Сообщений: 10
19.09.2013, 11:56  [ТС] #3
вообще конструктор кривой! Извиняюсь
0
bayanist17
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
zer0mail
2342 / 1972 / 193
Регистрация: 03.07.2012
Сообщений: 7,090
Записей в блоге: 1
29.09.2013, 12:16 #5
Посмотри в отладчике.
0
Fyret
184 / 170 / 13
Регистрация: 30.07.2013
Сообщений: 359
29.09.2013, 13:16 #6
Ну например
C++
1
while(t.head!=t.tail)
Разве t.head меняется? Нет и не должен, ибо const SList& t.
В общем, неверная логика.
1
bayanist17
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
zer0mail
2342 / 1972 / 193
Регистрация: 03.07.2012
Сообщений: 7,090
Записей в блоге: 1
29.09.2013, 14:05 #8
Для гаданий есть кофейная гуща , а программист должен понимать, что и зачем он делает .
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.09.2013, 14:05
Привет! Вот еще темы с ответами:

Конструктор присваивания или копирования - C++
Есть программа. В ней есть класс стэк. Нужно написать оператор копирования ИЛИ присваивания. Заранее спасибо. #include...

Для шаблонного класса перегрузить оператор присваивания, copy-конструктор, объекты cin и cout, оператор * - C++
Помогите в следующем: Для класса шаблона следует перегрузить оператор присваивания, конструктор копирования, бинарный оператор суммы «*»,...

Конструктор копирования и перегрузка оператора присваивания - C++
Здравствуйте! Возникла следующая проблема: не могу перегрузить оператор присваивания и сделать конструктор копирования Имеется...

Конструктор копирования и операция присваивания в классе - C++
Народ, вот есть такие объявления(motto - объект класса StringBad): StringBad ditto(motto); StringBad metoo = motto; StringBad...


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

Или воспользуйтесь поиском по форуму:
8
Yandex
Объявления
29.09.2013, 14:05
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru