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

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

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

Студворк — интернет-сервис помощи студентам
Имеем прототип
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
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
13.02.2013, 00:49
Ответы с готовыми решениями:

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

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

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

17
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
13.02.2013, 01:55
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
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
13.02.2013, 06:44
Цитата Сообщение от 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  [ТС]
-=ЮрА=-, сколько не думай логически, а если не знать, что должен быть конструктор копии, то ничего и не придумаешь. Я знаю, что там должны были быть операции сложения, я их просто опустил, так как оно даже не возвращало temp.
Мне ответ уже дали, только в другой теме. Я там просто специально сократил код. Пример бессмысленный, но он не работал, так как я не знал, что нужен конструктор копии, путал с оператором =.
1
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
13.02.2013, 18:24
Цитата Сообщение от kebal Посмотреть сообщение
Я там просто специально сократил код.
респект, хоть один вменяемый
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
13.02.2013, 19:38
Цитата Сообщение от 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
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
13.02.2013, 19:42
Ниже тоже самое но уже с контрукторами копирования и преобразования
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

Не по теме:

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

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
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  [ТС]
То есть когда у нас есть строка
pam1 = pam2 + pam3;
и оператор + возвращает экземпляр данного класса, то можно например вместо конструктора копии иметь
оператор присваивания, где правым операндом является экземпляр данного класса?
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
14.02.2013, 00:46
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
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
14.02.2013, 00:54
Теперь смотри как ведёт себя код без контрукторов копирования и преобразования
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

Не по теме:

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

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

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

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

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

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

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

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

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

Наверное, это было лишнее. Наверное, надо было просто сказать: "нет". Ты уж прости мня старика
1
9 / 9 / 2
Регистрация: 02.11.2012
Сообщений: 153
14.02.2013, 19:13  [ТС]
ааа, ну теперь понятно я ведь спрашиваю по незнанию)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
14.02.2013, 19:13
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru