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

Динамически выделенная память - C++

Восстановить пароль Регистрация
 
kebal
9 / 9 / 0
Регистрация: 02.11.2012
Сообщений: 153
13.02.2013, 00:49     Динамически выделенная память #1
Имеем прототип
Polinomials operator+(const Polinomials &) const;
И имеем функцию
C++
1
2
3
4
5
6
7
8
9
10
11
Polinomials Polinomials::operator+ (const Polinomials &) const
{
    Polinomials temp;
    return temp;
}
 
int main() {
    Polinomials first, second;
    //Конструкторы по умолчанию есть
    first + second;
}
Но в итоге происходит ошибка
_BLOCK_TYPE_IS_VALID
Почему? По идее просто ничего не должно произойти. Это всё равно что написать строчку 5 + 6;
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
-=ЮрА=-
Заблокирован
Автор FAQ
13.02.2013, 01:55     Динамически выделенная память #2
kebal, сам попробуй логически подумать что делает твой оператор +
Цитата Сообщение от kebal Посмотреть сообщение
Polinomials Polinomials::operator+ (const Polinomials &) const
{
* * Polinomials temp;
* * return temp;
}
- что с чем тут скалдывается, м?
Стукутры твоего класса не знаю потому лишь наброском могу показать
C++
1
2
3
4
5
6
Polinomials Polinomials::operator+ (const Polinomials &pAdd) const
{
    Polinomials temp = (*this);
    //Работа с полями pAdd и temp
    return temp;
}
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
13.02.2013, 06:44     Динамически выделенная память #3
Цитата Сообщение от kebal Посмотреть сообщение
По идее просто ничего не должно произойти.
ну так ничё и не происходит
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Polinomials {
 public:
 Polinomials operator+(const Polinomials &) const;
};
 
Polinomials Polinomials::operator+ (const Polinomials &) const
{
    Polinomials temp;
    return temp;
}
 
int main() {
    Polinomials first, second;
    //Конструкторы по умолчанию есть
    first + second;
}
чё делать, знаешь?
kebal
9 / 9 / 0
Регистрация: 02.11.2012
Сообщений: 153
13.02.2013, 18:16  [ТС]     Динамически выделенная память #4
-=ЮрА=-, сколько не думай логически, а если не знать, что должен быть конструктор копии, то ничего и не придумаешь. Я знаю, что там должны были быть операции сложения, я их просто опустил, так как оно даже не возвращало temp.
Мне ответ уже дали, только в другой теме. Я там просто специально сократил код. Пример бессмысленный, но он не работал, так как я не знал, что нужен конструктор копии, путал с оператором =.
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
13.02.2013, 18:24     Динамически выделенная память #5
Цитата Сообщение от kebal Посмотреть сообщение
Я там просто специально сократил код.
респект, хоть один вменяемый
-=ЮрА=-
Заблокирован
Автор FAQ
13.02.2013, 19:38     Динамически выделенная память #6
Цитата Сообщение от kebal Посмотреть сообщение
-=ЮрА=-, сколько не думай логически, а если не знать, что должен быть конструктор копии, то ничего и не придумаешь. Я знаю, что там должны были быть операции сложения, я их просто опустил, так как оно даже не возвращало temp.
Мне ответ уже дали, только в другой теме. Я там просто специально сократил код. Пример бессмысленный, но он не работал, так как я не знал, что нужен конструктор копии, путал с оператором =.
я не очень тебя понял, ну ок если помгогли норм
Внизу код без конструктора копирования и преобразования, с перегруженными операторатими сложения вычитания и присваивания + как бонус оператор <<
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
#include <iostream>
using namespace std;
 
class CMyValType
{
private:
   double val;
public :
    CMyValType();
    CMyValType operator=(const double &pVal);
    CMyValType operator=(const CMyValType &pVal);
    CMyValType operator+(const CMyValType &pVal);
    CMyValType operator-(const CMyValType &pVal);
    friend ostream & operator<<(ostream & ofs, CMyValType &pVal)
    {
        ofs<<pVal.val;
        return ofs;
    }
};
 
CMyValType::CMyValType()
{
    val = 0;
}
 
CMyValType CMyValType::operator=(const double &pVal)
{
    val = pVal;
    return (*this);
}
 
CMyValType CMyValType::operator =(const CMyValType &pVal)
{
    val = pVal.val;
    return (*this);
}
 
CMyValType CMyValType::operator +(const CMyValType &pVal)
{
    CMyValType temp;
    temp.val = (*this).val + pVal.val;
    return temp;
}
 
CMyValType CMyValType::operator -(const CMyValType &pVal)
{
    CMyValType temp;
    temp.val = (*this).val - pVal.val;
    return (*this);
}
 
int main()
{
    CMyValType pVal1;pVal1 = 5.0;
    CMyValType pVal2;pVal2 = 3.0;
    CMyValType pSum  = pVal1 + pVal2;
    CMyValType pMin  = pVal1 - pVal2;
    cout<<"pVal1 = "<<pVal1<<endl;
    cout<<"pVal1 = "<<pVal2<<endl;
    cout<<"pSum = "<<pSum<<endl;
    cout<<"pMin = "<<pMin<<endl;
    return 0;
}
http://liveworkspace.org/code/4fcdkW$0
Миниатюры
Динамически выделенная память  
-=ЮрА=-
Заблокирован
Автор FAQ
13.02.2013, 19:42     Динамически выделенная память #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
#include <iostream>
using namespace std;
 
class CMyValType
{
private:
    double val;
public :
    CMyValType();//конструктор по умолчанию
    CMyValType(const double &pVal);//конструктор преобразования
    CMyValType(const CMyValType &pVal);//конструктор копирования
    CMyValType operator=(const double &pVal);
    CMyValType operator=(const CMyValType &pVal);
    CMyValType operator+(const CMyValType &pVal);
    CMyValType operator-(const CMyValType &pVal);
    friend ostream & operator<<(ostream & ofs, CMyValType &pVal)
    {
        ofs<<pVal.val;
        return ofs;
    }
};
 
CMyValType::CMyValType()
{
    val = 0;
}
 
CMyValType::CMyValType(const double &pVal)
{
    val = pVal;
}
 
CMyValType::CMyValType(const CMyValType &pVal)
{
    val = pVal.val;
}
 
CMyValType CMyValType::operator=(const double &pVal)
{
    val = pVal;
    return (*this);
}
 
CMyValType CMyValType::operator =(const CMyValType &pVal)
{
    val = pVal.val;
    return (*this);
}
 
CMyValType CMyValType::operator +(const CMyValType &pVal)
{
    CMyValType temp;
    temp.val = (*this).val + pVal.val;
    return temp;
}
 
CMyValType CMyValType::operator -(const CMyValType &pVal)
{
    CMyValType temp;
    temp.val = (*this).val - pVal.val;
    return (*this);
}
 
int main()
{
    CMyValType pVal1 = 5.0;
    CMyValType pVal2 = 3.0;
    CMyValType pSum  = pVal1 + pVal2;
    CMyValType pMin  = pVal1 - pVal2;
    cout<<"pVal1 = "<<pVal1<<endl;
    cout<<"pVal1 = "<<pVal2<<endl;
    cout<<"pSum = "<<pSum<<endl;
    cout<<"pMin = "<<pMin<<endl;
    return 0;
}
Миниатюры
Динамически выделенная память  
-=ЮрА=-
13.02.2013, 19:43
  #8

Не по теме:

Конструкторы преобразования позволили это

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
CMyValType pVal1;pVal1 = 5.0;
* * CMyValType pVal2;pVal2 = 3.0;
Записать без лишнего использования перегрузки присваивания

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
CMyValType pVal1 = 5.0;
* * CMyValType pVal2 = 3.0;

kebal
9 / 9 / 0
Регистрация: 02.11.2012
Сообщений: 153
14.02.2013, 00:34  [ТС]     Динамически выделенная память #9
То есть когда у нас есть строка
pam1 = pam2 + pam3;
и оператор + возвращает экземпляр данного класса, то можно например вместо конструктора копии иметь
оператор присваивания, где правым операндом является экземпляр данного класса?
-=ЮрА=-
Заблокирован
Автор FAQ
14.02.2013, 00:46     Динамически выделенная память #10
kebal, я решил точно сам всё проверить
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
#include <iostream>
using namespace std;
 
class CMyValType
{
private:
    double val;
public :
    CMyValType();//конструктор по умолчанию
    CMyValType(const double &pVal);//конструктор преобразования
    CMyValType(const CMyValType &pVal);//конструктор копирования
    CMyValType operator=(const double &pVal);
    CMyValType operator=(const CMyValType &pVal);
    CMyValType operator+(const CMyValType &pVal);
    CMyValType operator-(const CMyValType &pVal);
    friend ostream & operator<<(ostream & ofs, CMyValType &pVal)
    {
        ofs<<pVal.val;
        return ofs;
    }
};
 
CMyValType::CMyValType()
{
    val = 0;
    cout<<"Default constructor called"<<endl;
}
 
CMyValType::CMyValType(const double &pVal)
{
    cout<<"Transform constructor called"<<endl;
    val = pVal;
    
}
 
CMyValType::CMyValType(const CMyValType &pVal)
{
    cout<<"Copy constructor called"<<endl;
    val = pVal.val;
}
 
CMyValType CMyValType::operator=(const double &pVal)
{
    cout<<"operator=(const double &pVal) called"<<endl;
    val = pVal;
    return (*this);
}
 
CMyValType CMyValType::operator =(const CMyValType &pVal)
{
    cout<<"operator =(const CMyValType &pVal) called"<<endl;
    val = pVal.val;
    return (*this);
}
 
CMyValType CMyValType::operator +(const CMyValType &pVal)
{
    CMyValType temp;
    cout<<"operator +(const CMyValType &pVal) called"<<endl;
    temp.val = (*this).val + pVal.val;
    return temp;
}
 
CMyValType CMyValType::operator -(const CMyValType &pVal)
{
    CMyValType temp;
    cout<<"operator -(const CMyValType &pVal) called"<<endl;
    temp.val = (*this).val - pVal.val;
    return (*this);
}
 
int main()
{
    CMyValType pVal1 = 5.0;
    CMyValType pVal2 = 3.0;
    CMyValType pSum  = pVal1 + pVal2;
    CMyValType pMin  = pVal1 - pVal2;
    CMyValType pTst(pVal1 + pVal2);
    cout<<"pVal1 = "<<pVal1<<endl;
    cout<<"pVal1 = "<<pVal2<<endl;
    cout<<"pSum = "<<pSum<<endl;
    cout<<"pMin = "<<pMin<<endl;
    cout<<"pTst = "<<pTst<<endl;
    return 0;
}
Миниатюры
Динамически выделенная память  
-=ЮрА=-
Заблокирован
Автор FAQ
14.02.2013, 00:54     Динамически выделенная память #11
Теперь смотри как ведёт себя код без контрукторов копирования и преобразования
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
#include <iostream>
using namespace std;
 
class CMyValType
{
private:
    double val;
public :
    CMyValType();//конструктор по умолчанию
//  CMyValType(const double &pVal);//конструктор преобразования
//  CMyValType(const CMyValType &pVal);//конструктор копирования
    CMyValType operator=(const double &pVal);
    CMyValType operator=(const CMyValType &pVal);
    CMyValType operator+(const CMyValType &pVal);
    CMyValType operator-(const CMyValType &pVal);
    friend ostream & operator<<(ostream & ofs, CMyValType &pVal)
    {
        ofs<<pVal.val;
        return ofs;
    }
};
 
CMyValType::CMyValType()
{
    val = 0;
    cout<<"Default constructor called"<<endl;
}
/*
CMyValType::CMyValType(const double &pVal)
{
    cout<<"Transform constructor called"<<endl;
    val = pVal;
    
}
 
CMyValType::CMyValType(const CMyValType &pVal)
{
    cout<<"Copy constructor called"<<endl;
    val = pVal.val;
}
*/
CMyValType CMyValType::operator=(const double &pVal)
{
    cout<<"operator=(const double &pVal) called"<<endl;
    val = pVal;
    return (*this);
}
 
CMyValType CMyValType::operator =(const CMyValType &pVal)
{
    cout<<"operator =(const CMyValType &pVal) called"<<endl;
    val = pVal.val;
    return (*this);
}
 
CMyValType CMyValType::operator +(const CMyValType &pVal)
{
    CMyValType temp;
    cout<<"operator +(const CMyValType &pVal) called"<<endl;
    temp.val = (*this).val + pVal.val;
    return temp;
}
 
CMyValType CMyValType::operator -(const CMyValType &pVal)
{
    CMyValType temp;
    cout<<"operator -(const CMyValType &pVal) called"<<endl;
    temp.val = (*this).val - pVal.val;
    return (*this);
}
 
int main()
{
    CMyValType pVal1;pVal1 = 5.0;
    CMyValType pVal2;pVal2 = 3.0;
    CMyValType pSum  = pVal1 + pVal2;
    CMyValType pMin  = pVal1 - pVal2;
    CMyValType pTst(pVal1 + pVal2);
    cout<<"pVal1 = "<<pVal1<<endl;
    cout<<"pVal1 = "<<pVal2<<endl;
    cout<<"pSum = "<<pSum<<endl;
    cout<<"pMin = "<<pMin<<endl;
    cout<<"pTst = "<<pTst<<endl;
    return 0;
}
http://liveworkspace.org/code/40QFeQ$0
Миниатюры
Динамически выделенная память  
-=ЮрА=-
14.02.2013, 01:01
  #12

Не по теме:

обрати внимание в последнем коде на этот момент

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
CMyValType pTst(pVal1 + pVal2);
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
//* CMyValType(const double &pVal);//конструктор преобразования
//* CMyValType(const CMyValType &pVal);//конструктор копирования
- компилятор сам "сделал" дефалтный конструктор копирования

kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
14.02.2013, 01:56     Динамически выделенная память #13
Цитата Сообщение от kebal Посмотреть сообщение
можно например вместо конструктора копии иметь
оператор присваивания, где правым операндом является экземпляр данного класса?
"вместо" не получится. Коль скоро ты задействуешь "=", то оператор "=" вызовется в любом случае, вне зависимости от того есть у тебя КК или нет; а зависит, это как мы выяснил и от того, возвращает "=" ссылку или объект

То есть схема такая:

1) если "=" возвращает ссылку- вызывается "="
2) если "=" возвращает объект- вызывается "=" и КК

Вот и вся разница. Естессно, я рекомендую первый вариант. Ибо не фиг выпендриваться лишний раз.

Кроме того, помним что компилятор может вести себя не так, как написано в книжке или не так, как мы предполагаем
Почему не вызывается конструктор копирования?

Брайан Оверленд "C++ без страха" старается осветить именно эти вопросы
kebal
9 / 9 / 0
Регистрация: 02.11.2012
Сообщений: 153
14.02.2013, 16:14  [ТС]     Динамически выделенная память #14
Добавлено через 1 минуту
Цитата Сообщение от kravam Посмотреть сообщение
1) если "=" возвращает ссылку- вызывается "="
2) если "=" возвращает объект- вызывается "=" и КК
Вы имелли ввиду если + возвращает, да?
А потом проверяется, что именно принимает оператор =
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
14.02.2013, 16:41     Динамически выделенная память #15
Да нет же. Ты стал разбираться с КК и "="

можно например вместо конструктора копии иметь
оператор присваивания, где правым операндом является экземпляр данного класса?
Так что именно их я и имел ввиду. Спрашивай.
kebal
9 / 9 / 0
Регистрация: 02.11.2012
Сообщений: 153
14.02.2013, 18:07  [ТС]     Динамически выделенная память #16
Вот вы говорите, если = возвращает...
Оператор = если использовать по делу вообще возвращает только this, да и то ради того, чтобы обеспечить сцепленное присваивание, поэтому я не понимаю какое это имеет тут отношение
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
14.02.2013, 18:46     Динамически выделенная память #17
Ну да. То есть отвечая на твой вопрос:
Цитата Сообщение от kravam Посмотреть сообщение
можно например вместо конструктора копии иметь
оператор присваивания, где правым операндом является экземпляр данного класса?
я попытался показать тык скыть иерархию "=" и КК, а именно: вызов КК зависит от того, что возвращает "="

Наверное, это было лишнее. Наверное, надо было просто сказать: "нет". Ты уж прости мня старика
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.02.2013, 19:13     Динамически выделенная память
Еще ссылки по теме:

C++ Память распределить динамически
Ругается на деструктор (выделял динамически память). Почему? C++
Запись в динамически выделенную память C++

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

Или воспользуйтесь поиском по форуму:
kebal
9 / 9 / 0
Регистрация: 02.11.2012
Сообщений: 153
14.02.2013, 19:13  [ТС]     Динамически выделенная память #18
ааа, ну теперь понятно я ведь спрашиваю по незнанию)
Yandex
Объявления
14.02.2013, 19:13     Динамически выделенная память
Ответ Создать тему
Опции темы

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