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

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

13.02.2013, 00:49. Показов 934. Ответов 17
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Имеем прототип
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;
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.02.2013, 00:49
Ответы с готовыми решениями:

Память, выделенная для строки
Имеется код #include <iostream> int main() { std::string s = "Hi my name is John"; ...

Резкий выход из проги: куда девается выделенная переменной память?
int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, ...

Память распределить динамически
Задали такую задачу :память матрицы распределить динамически .Найти среднее арифметическое области...

Динамически распределяемая память
Задача С одномерным динамическим массивом, состоящим из n вещественных элементов, произвести...

17
Заблокирован
Автор 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;
}
0
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
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;
}
чё делать, знаешь?
0
9 / 9 / 2
Регистрация: 02.11.2012
Сообщений: 153
13.02.2013, 18:16  [ТС] 4
-=ЮрА=-, сколько не думай логически, а если не знать, что должен быть конструктор копии, то ничего и не придумаешь. Я знаю, что там должны были быть операции сложения, я их просто опустил, так как оно даже не возвращало temp.
Мне ответ уже дали, только в другой теме. Я там просто специально сократил код. Пример бессмысленный, но он не работал, так как я не знал, что нужен конструктор копии, путал с оператором =.
1
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
13.02.2013, 18:24 5
Цитата Сообщение от kebal Посмотреть сообщение
Я там просто специально сократил код.
респект, хоть один вменяемый
0
Заблокирован
Автор 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
Миниатюры
Динамически выделенная память  
1
Заблокирован
Автор 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;
}
Миниатюры
Динамически выделенная память  
1
-=ЮрА=-
13.02.2013, 19:43
  #8

Не по теме:

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

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

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

0
9 / 9 / 2
Регистрация: 02.11.2012
Сообщений: 153
14.02.2013, 00:34  [ТС] 9
То есть когда у нас есть строка
pam1 = pam2 + pam3;
и оператор + возвращает экземпляр данного класса, то можно например вместо конструктора копии иметь
оператор присваивания, где правым операндом является экземпляр данного класса?
0
Заблокирован
Автор 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;
}
Миниатюры
Динамически выделенная память  
1
Заблокирован
Автор 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
Миниатюры
Динамически выделенная память  
0
-=ЮрА=-
14.02.2013, 01:01
  #12

Не по теме:

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

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

0
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
14.02.2013, 01:56 13
Цитата Сообщение от kebal Посмотреть сообщение
можно например вместо конструктора копии иметь
оператор присваивания, где правым операндом является экземпляр данного класса?
"вместо" не получится. Коль скоро ты задействуешь "=", то оператор "=" вызовется в любом случае, вне зависимости от того есть у тебя КК или нет; а зависит, это как мы выяснил и от того, возвращает "=" ссылку или объект

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

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

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

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

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

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

Наверное, это было лишнее. Наверное, надо было просто сказать: "нет". Ты уж прости мня старика
1
9 / 9 / 2
Регистрация: 02.11.2012
Сообщений: 153
14.02.2013, 19:13  [ТС] 18
ааа, ну теперь понятно я ведь спрашиваю по незнанию)
0
14.02.2013, 19:13
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.02.2013, 19:13
Помогаю со студенческими работами здесь

Запись в динамически выделенную память
Во общем, в dll выделяется память под char *, через new. Требуется в другой программе в которой я...

Удалить динамически выделенную память
Получится ли освободить динамически выделенную память в интерфейсе одного класса, в интерфейсе...

Динамически распределяемая память. Массивы
Доброго времени суток. Помогите пожалуйста решить задачку.:wall: Выборка всех ненулевых...

Массивы. Динамически распределяемая память.
Всем привет. Помогите решить задачку. В одномерном массиве, состоящем из n вещественных элементов,...


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

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