Форум программистов, компьютерный форум, киберфорум
Visual C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
Айхрень...
 Аватар для Paulie
306 / 176 / 7
Регистрация: 02.06.2009
Сообщений: 1,077

Передача массива List в функцию по ссылке

08.04.2011, 23:23. Показов 2140. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В общем есть самописный класс mList<T>, позволяющий реализовать массивы, как ассоциативные, так и обычные.... в общем проблема в следующем.
Сначла выложу пару методов из класса mList<T>, которые я тут использую:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
template<class NodeType>
void mList<NodeType>::push_back(const NodeType &_value)
{
    mNode<NodeType> *tmp = new mNode<NodeType>(_value);
    if (IsEmpty())
        firstPtr = lastPtr = currentPtr = tmp;
    else
    {
        lastPtr->nextPtr = tmp;
        lastPtr = currentPtr = tmp;
    }
    count++;
}
 
NodeType &data()
{
    return currentPtr->data;
}//return current element

А это конструктор класса mNode (одна из перегрузок)...
C++
1
2
3
4
5
6
mNode(const NodeType &_value)
    {
        this->data = _value;
        this->key = "";
        nextPtr = 0;
    }


Есть две структуры:

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
typedef struct _asdf
{
    int i;
    string name;
    string sername;
 
    _asdf()
    {
        name = "";
        sername = "";
    }
 
    _asdf& operator = (const _asdf &_value)
    {
        i = _value.i;
        name = _value.name;
        sername = _value.sername;
        return *this;
    }
 
    ~_asdf()
    {
        name.~basic_string();
        sername.~basic_string();
    }
 
} asdf;
 
typedef struct _qwer
{
    mList<asdf> a;
 
    _qwer &operator = (_qwer&& _value)
    {
        _value.a.first();
        do
        {
            //_asdf _a = _value.a.data();
            a.push_back( _value.a.data() );
        } while ( !_value.a.next().EOL() );
 
        return *this;
    }
 
    ~_qwer()
    {
        a.RemoveAll();
    }
} qwer;
Делаю следующий код (для примера самый что не есть примитивный код:

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
mList<qwer> list;
 
void setdata(qwer q)
{
    list.push_back(q);
}
 
string getdata()
{
    string str = "";
 
    list.first();
    do
    {
        qwer q = list.data();
        q.a.first();
        do
        {
            str += q.a.data().name + string("\n");
        } while (!q.a.next().EOL());
    } while (!list.next().EOL());
 
    return str;
}
 
int _tmain(int argc, _TCHAR* argv[])
{
    asdf &as1 = *new asdf();
    asdf &as2 = *new asdf();
    asdf &as3 = *new asdf();
    asdf &as4 = *new asdf();
    asdf &as5 = *new asdf();
    
        as1.i = 1;
        as1.name = "name1";
        as1.sername = "sername1";
        as2.i = 2;
        as2.name = "name2";
        as2.sername = "sername2";
        as3.i = 3;
        as3.name = "name3";
        as3.sername = "sername3";
        as4.i = 4;
        as4.name = "name4";
        as4.sername = "sername4";
        as5.i = 5;
        as5.name = "name5";
        as5.sername = "sername5";
 
 
    qwer &q1 = *new qwer();
    q1.a.push_back(as1);
    q1.a.push_back(as2);
    q1.a.push_back(as3);
    q1.a.push_back(as4);
    q1.a.push_back(as5);
 
    delete &as1;
    delete &as2;
    delete &as3;
    delete &as4;
    delete &as5;
 
    //тут даже не важно, вызываю я функцию, или просто вызываю метод класса, один хер не пашет как надо
    setdata(q1);
    //list.push_back(q1);
    
    delete &q1;
    printf("%s\n", getdata().c_str());
 
    system("pause");
    return 0;
}
В общем получается какой расклад, при вызове delete &q1 - вызывается деструктор сего класса, а следовательно убиваются данные в q1.a... При этом вызов delete &as1..5 - ни к чему критическому не приводит.

Также обратил внимантие на перегруженных операторов = в классах, в первом классе _asdf он работает, если даже убрать &, передавая по значению, или даже поставить _asf &&_value (правда в этом случае перегрузка неотрабатывает, видимо не совпадают переданные данные с тем, что требует оператор=)... а во втором классе работает только при:
_qwer &&_value, да и перегруженный оператор видимо неотрабатывает с таким набором входных параметров (а с другим - ругается)....

Ну и возникает вопрос - как сделать класс _qwer так, чтобы он принимал нормально правый аргумент при операции =, которая используется в конструкторе класса mNode (второй листинг)... Иначе, получается так, что в массиве list - свойство a - принимает в сови значения ссылки на q1.a... и при уничтожении q1 - всё рушится....
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
08.04.2011, 23:23
Ответы с готовыми решениями:

Передача Unicode-строки в функцию по ссылке
Добрый день, товарищи форумчане. Я столкнулся с такой вот задачей: Есть некая функция, например, void FindFile(LPCWSTR Dir, LPCWSTR...

Передача массива в функцию
Помогите исправить код, пытался здесь передать массив но ничего не вышло #include &lt;conio.h&gt; #include &lt;iostream&gt; ...

Передача массива в функцию
всем доброго времени суток, мне надо в массиве a найти минимальный элемент в строке и записать его в массив m, а во второй массив s нужно...

8
Делаю внезапно и красиво
Эксперт С++
 Аватар для Deviaphan
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
09.04.2011, 08:28
C++
1
typedef struct _asdf {} asdf
На С++ не требуется так делать.

И ещё, имена классам осмысленные давать не помешает.

C++
1
 _qwer &operator = (_qwer&& _value)
Это вообще что? Ссылка на ссылку, якобы? И, почему не const?

Добавлено через 1 минуту
C++
1
2
        asdf &as1 = *new asdf();
       delete &as1;
Не сразу дошло.))) Спс, поржал.)

C++
1
2
asdf * as1 = new asdf;
delete as1;
1
Айхрень...
 Аватар для Paulie
306 / 176 / 7
Регистрация: 02.06.2009
Сообщений: 1,077
09.04.2011, 11:34  [ТС]
Цитата Сообщение от Deviaphan Посмотреть сообщение
И ещё, имена классам осмысленные давать не помешает.
Это я писал просто, чтобы понять, в чём в моей программе ошибка...


Цитата Сообщение от Deviaphan Посмотреть сообщение
Не сразу дошло.))) Спс, поржал.)
Смейся, не смейся, а asdf *.... не подходит потому, что оператор [] перестаёт работать, а в программе, если сделать просто asdf as; - опять же по выходу из цикла - уничтожается переменная, и всё катится к чёрту....


Цитата Сообщение от Deviaphan Посмотреть сообщение
Это вообще что? Ссылка на ссылку, якобы? И, почему не const?
Поясняю - не конст, потому, что в данном классе содержится переменная mList<asdf> a; и если объявить конст, то вызов в перегруженном операторе _value.a.first() например, приводит к ошибке компиляции.... Если убрать &&, пишет, что нет перегрузки для =, которая бы поддерживала это...

Добавлено через 2 минуты
Мне нужен более конструктивный ответ - где я не прав... у меня в мозгу и так уже переполнение буфера блин, от всей этой работы.....
0
Делаю внезапно и красиво
Эксперт С++
 Аватар для Deviaphan
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
09.04.2011, 12:06
(*adsf)[i]

first() - должен быть перегружен и для const.

Ссылок на ссылки не бывает. В новой спецификации она приравнена изначальной ссылке.
1
Айхрень...
 Аватар для Paulie
306 / 176 / 7
Регистрация: 02.06.2009
Сообщений: 1,077
09.04.2011, 12:48  [ТС]
Цитата Сообщение от Deviaphan Посмотреть сообщение
(*adsf)[i]
А чем плох мой вариант? Или он просто непопулярен? Или небезопасен?


Цитата Сообщение от Deviaphan Посмотреть сообщение
first() - должен быть перегружен и для const
Пришлось большинство методов сделать константными, а currentPtr - Mutable... это нормально? mutable из спецификации ещё не исключён?
0
Делаю внезапно и красиво
Эксперт С++
 Аватар для Deviaphan
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
09.04.2011, 12:54
Цитата Сообщение от Paulie Посмотреть сообщение
Пришлось большинство методов сделать константными
Все методы, которые не изменяют состояние объекта должны быть константными.
Для некоторых методов необходимо делать константную и не константную реализации.

По идее, методы, не меняющие состояние объекта и currentPtr менять не должны. Код у тебя не приведён, так что не знаю, зачем оно вообще нужно.)
0
Айхрень...
 Аватар для Paulie
306 / 176 / 7
Регистрация: 02.06.2009
Сообщений: 1,077
09.04.2011, 13:12  [ТС]
Deviaphan, метод first делает внутренний указатель currentPtr на первый, метод next переводит его на следующий... все их пришлось сделать константными)) А следовательно указатель currentPtr я объявил как mutable, и всё зашились работает!
0
Делаю внезапно и красиво
Эксперт С++
 Аватар для Deviaphan
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
09.04.2011, 13:15
У тебя с логикой там ошибка где-то.) Эти методы меняют объект и не могут быть константными.
Я думал, что first возвращает первый объект, как это происходит в STL.
0
Айхрень...
 Аватар для Paulie
306 / 176 / 7
Регистрация: 02.06.2009
Сообщений: 1,077
09.04.2011, 14:27  [ТС]
Всё, разобрался что может быть константным, что не может быть)) Вкуривать в STL нет ни малейшего желания (досконально, вчитываясь во все аллокаторы и т.п.), но в целом их позиция ясна, и мне нравится больше, чем моя, но меня совершенно не устраивал vector, под мои задачи хиленько годился... Так что наваял своё, более простое, но тоже более-менее стабильное и чистое))
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
09.04.2011, 14:27
Помогаю со студенческими работами здесь

Передача массива в функцию по ссылке
Здравствуйте. Есть функция: void f(int &amp;a) { int *p=&amp;a; p=1; } Но почему-то при попытке передать ей массив ругается...

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

Передача по ссылке двумерного динамического массива в функцию
Приведите, пожалуйста, пример. Нигде не могу найти.

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

Передача указателя в функцию по ссылке
Почему невозможно передать указатель в функцию по ссылке? void function(int &amp; (*a)){ ... ... ... } void main(){ int x; ...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
[В процессе разработки] SDL3 для Web (WebAssembly): Сборка библиотек SDL3 и Box2D из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия SDL 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual. . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru