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

Передача параметра по ссылке - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ libxml.lib http://www.cyberforum.ru/cpp-beginners/thread651353.html
Собираю Sphinx. Он просит библиотеку libxml.lib , а я нахожу в интернетах libxml2.lib. Кто что может что посоветовать?
C++ Как сделать перерисовку окна при изменении горизонтального размера вобщем задача написать оконное приложение на с++ как сделать так чтобы окно появлялось по центру экрана есть какие то функции или в пикселях выставлять нужно ? и как сделать перерисовку окна при... http://www.cyberforum.ru/cpp-beginners/thread651344.html
комбинация клавиш в turbo с++ C++
Порскащите пожалуйста, как встовлять текст в turbo c++ , комбтнация ctrl+v и через правую кнопку мыши вставка неполучается.
Размер массива C++
Можно ли изменить размер обычного массива?
C++ Возвращаемое значение функции http://www.cyberforum.ru/cpp-beginners/thread651237.html
Здравствуйте Я тут новенький. Очень трудно у вас проходить регистрацию. У меня вопрос по С++ Компилятор: Code Blocks #include <iostream> #include <string.h>
C++ Вывод слов из строки Суть задачи: Дан текст, состоящий из N (2<=N<=10) строк с максимальной длиной 80 символов. Необходимо вывести в обратном алфавитном порядке те слова, длина которых не превышает K символов.... подробнее

Показать сообщение отдельно
moskitos80
61 / 61 / 10
Регистрация: 04.10.2011
Сообщений: 217
Завершенные тесты: 1

Передача параметра по ссылке - C++

13.09.2012, 13:51. Просмотров 839. Ответов 3
Метки (Все метки)

Всем здравствуйте. Други, помогите разобраться.
Сидю вникаю в работу указателей и памяти, паралельно пытаюсь написать велосипед, в виде контейнера аля вектор. После хочу сваять из него темплейт и перегрузить оператор [] и т.п. , а пока он имеет такой вид, как я представил. Вот примерная схема организации данных:

Передача параметра по ссылке


Здесь класс MsqArr имеет поле MsqData* dataPtr - массив указателей на структуры, которые содержат число - индекс, и указатель на данные, позже все действия по сортировке и перестановке будут производиться с массивом указателей на структуры.

Так вот вопрос, ниже в коде, в методе:
MsqArr::insert(const int idx, const int &val)

- если передать параметр val не по ссылке, а по значению:
MsqArr::insert(const int idx, const int val)

то после, когда я вызываю этот метод сколько то раз, что бы задать пары индекс - значение, и вывожу на экран... Вуаля - все элементы почему - то имеют одно и тоже значение - то которое передавалось последнему вызову, хотя значения индексов имеют нужные значения. Не подскажите почему?

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
#include <iostream>
 
using namespace std;
 
///////////////////////////////////////////////////////////
struct MsqData {
    int index;
    const int* data;
};
///////////////////////////////////////////////////////////
class MsqArr {
 
    public :
 
        MsqArr() :
            length (0),
            dataPtr(NULL)
        {}
 
        ~MsqArr()
        {
            delete [] this->dataPtr;
        }
        // Вот сдесь если второй параметр передавать не по ссылке
        // то все элементы будут иметь одно и то же значение - последнее.
        // @param int idx - индекс элемента
        // @param int val - значение элемента
        bool insert(const int idx, const int val)
        {
            MsqData *ptrArr = new MsqData[this->length + 1];
 
            for (int i = 0; i < this->length; i++) {
                *(ptrArr + i) = *(this->dataPtr + i);
                delete (this->dataPtr + i);
            }
 
            this->dataPtr = ptrArr;
 
            (this->dataPtr + this->length)->index = idx;
            (this->dataPtr + this->length)->data  =& val;
 
            this->length++;
            return true;
        }
 
        friend ostream& operator << (ostream& out, MsqArr& arr)
        {
            cout << "Array(" << endl;
            for (int i = 0; i < arr.length; i++) {
                cout << "\t[" << (arr.dataPtr + i)->index << "] => "
                     << *((arr.dataPtr + i)->data) << endl;
            }
            cout << ")" << endl;
            return out;
        }
 
    protected :
        int length;
        MsqData* dataPtr;
};
///////////////////////////////////////////////////////////
int main()
{
    MsqArr arr1;
 
    try {
 
        arr1.insert(0, 111);
        arr1.insert(1, 222);
        arr1.insert(2, 333);
        arr1.insert(3, 444);
 
    } catch (bad_alloc) {
        cout << "Bad allocation memory!" << endl;
    }
 
    cout << arr1 << endl;
 
    return 0;
}
ЗЫ: Я конечно понимаю, что, передав параметр по значению, переменная val - в методе становится локальной и погибает по окончанию работы с методом, а указатель (this->dataPtr + ... )->data указывает хрензнаеткуда, но почему в итоге вывод имеет следующий вид:

// если передавать НЕ по ссылке то таким (парадокс):
Array(
[0] => 444
[1] => 444
[2] => 444
[3] => 444
)

// если передавть параметр по ссылке, то вывод проги будет следующим (то что нужно):
Array(
[0] => 111
[1] => 222
[2] => 333
[3] => 444
)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru