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

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

Войти
Регистрация
Восстановить пароль
 
 
kebal
9 / 9 / 0
Регистрация: 02.11.2012
Сообщений: 153
#1

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

13.02.2013, 00:49. Просмотров 633. Ответов 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;
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.02.2013, 00:49     Динамически выделенная память
Посмотрите здесь:

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

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

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

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

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

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

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
-=ЮрА=-
Заблокирован
Автор 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
быдлокодер
1693 / 880 / 44
Регистрация: 04.06.2008
Сообщений: 5,441
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
быдлокодер
1693 / 880 / 44
Регистрация: 04.06.2008
Сообщений: 5,441
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
быдлокодер
1693 / 880 / 44
Регистрация: 04.06.2008
Сообщений: 5,441
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) если "=" возвращает объект- вызывается "=" и КК
Вы имелли ввиду если + возвращает, да?
А потом проверяется, что именно принимает оператор =
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.02.2013, 16:41     Динамически выделенная память
Еще ссылки по теме:

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

Динамически распределяемая память, удаление символов в строке - C++
Нужна помощь в написании программы: Часть кода: #include &lt;iostream&gt; #include &lt;string&gt; using namespace std; char* del(char...

Динамически выделить память под массив функций - C++
QByteArray (SerfingThread::*lp_GetRequest)(const QByteArray&amp; ,const QByteArray&amp;); как сделать тоже самое только через new? как правильно...

Ругается на деструктор (выделял динамически память). Почему? - C++
Вот код: #include &lt;stdio.h&gt; #include &lt;conio.h&gt; #include &lt;time.h&gt; #include &lt;stdlib.h&gt; class MClass { private: int...


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

Или воспользуйтесь поиском по форуму:
kravam
быдлокодер
1693 / 880 / 44
Регистрация: 04.06.2008
Сообщений: 5,441
14.02.2013, 16:41     Динамически выделенная память #15
Да нет же. Ты стал разбираться с КК и "="

можно например вместо конструктора копии иметь
оператор присваивания, где правым операндом является экземпляр данного класса?
Так что именно их я и имел ввиду. Спрашивай.
Yandex
Объявления
14.02.2013, 16:41     Динамически выделенная память
Ответ Создать тему
Опции темы

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