| Другое > Hard'n'Soft |
| Програмирование на C++ |
| << < (6/25) > >> |
| gepar:
Спасибо за пример, он мне более понятный. Не знал что у структур тоже может быть конструктор . Я только с this немного ознакомлен и не могу понять на что он в этом случае указывает: ListItem* item = this; (строка 17). Я пока встречал только применение вида this->x и (*this).x ну и не явное использование его. |
| ALKO:
подскажите плиз,умоляю,аааа ползаю на коленях :'( подробную инструкцию,как добавить внешний файл в экзэшник,знаю что через ресурсы,но как именно хз. и как его потом вызывать Добавлено позже: на С++ Builder |
| HoRRoR:
--- Цитата ---Спасибо за пример, он мне более понятный. Не знал что у структур тоже может быть конструктор . Я только с this немного ознакомлен и не могу понять на что он в этом случае указывает: --- Конец цитаты --- В C++ структуры и классы различаются лишь принципом инкапсуляции - у классов все элементы по умолчанию приватные, у структур - публичные. Т.е. классы соответствуют парадигмам ООП. В чистом си конструкторов быть не может в принципе. this указывает на текущий элемент. Т.е. если мы создали элемент ListItem, например, ListItem *item = new ListItem(""), то внутри него this равен этому item. Также внутри методов нет разницы, писать this->x или x. Вернее, есть, если существует переменная x, которая перекрывает поле x, тогда придётся писать this->x, чтобы дать понять, что обращение идёт именно к полю, а не к существующей внутренней переменной. Чтобы было понятней: --- Код: ---class Sample { int x, y; void foo() { x += 4; // Можно написать this->x - разницы нет } void setX(int x) { this->x = x; // Т.к. у нас появилась переменная x, то обращение будет именно к ней. // Поэтому надо писать this->x, чтобы получить доступ к полю. } }; --- Конец кода --- ALKO, пишешь resource script (*.rc), компилируешь его, затем через #pragma resource или как-то так аттачишь. Точно не помню, чуть позже расскажу подробней - у меня где-то исходники валяются. |
| gepar:
Ну чтоже, с заданием лабораторной справился, но не чувствую я уверенности в том что я овладел полностью указателями (неуверенность пришла какраз после этой лабораторной). |
| gepar:
Судя по тому как принимает лабораторные преподша вывода 5и строчек через cout создающих имитацию работы программы было бы достаточно :) |
| gepar:
И опять я с этими указателями :) Что не так у меня в коде? При попытке вызвать функцию материться мол не может сконвертировать двойной указатель в одинарный. --- Код: --- int main() { int *pAbc=new int; ... maximum(a,n,&pAbc); cout<<"abc="<<*pAbc; return 0; } void maximum(int a[], int n, int *abc) { *abc=a[1]; for (int i=0;i<n;i++) if (a[i]>*abc) *abc=a[i]; } --- Конец кода --- Весь код не привожу чтобы не запутывать, хотя могу его полностью привести. Это я опять где-то затупил в одном месте и не замечаю наверное. |
| HoRRoR:
Э, а зачем ты берёшь адрес указателя? Вот у тебя и получается указатель на указатель - &pAbc. И динамически создавать ОДИН инт - верх непрактичности, разве что только если ты это в познавательных целях делаешь. Только вот ты его уничтожить забываешь через delete - утечка памяти. |
| gepar:
HoRRoR,да до удаления ещё не дошло, я его передать никак не мог потому минипрограмма в стадии разработки :) Я уже вспомнил что адрес мне нужно было бы кинуть если бы у меня pAbc было просто число int например, а не указатель, вот знал же что где-то жёстко туплю. Добавлено позже: Теперь возник другой вопрос, почему всё что я мудрю с указателем в функции не изменяет реальный указатель? Неужто я и правда так плохо знаком с указателями :( --- Код: ---int main() { int *pAbc; int a[n]; ... pAbc=&a[0];// я делаю это чтобы хоть какое-то значение было в pAbc. max=maximum (a,n,pAbc);// по идеи pAbc тоже ведь должен измениться cout<<"abc="<<*pAbc; // выводится a[0] несмотря на то что в maximum() было якобы изменение pAbc ... int maximum(int a[], int n, int *abc) { int max=0; // max - не максимальный элемент, а сумма элементов что в массиве идут до максимального элемента abc=&a[0]; for (int i=0;i<n;i++) if (a[i]>*abc) abc=&a[i]; for (int i=0; &a[i]!=abc;i++) // да, глупо я придумал наверное, ну да суть не в этом max+=a[i]; abc=&a[9];// добавил для проверки что pAbc не изменяеться (в массиве 10 элементов), при выводе в main выводиться не a[9] return max; } --- Конец кода --- Могу предоставить полный код если это нужно. |
| HoRRoR:
Ты всё совсем не так понимаешь. Передаваемые объекты копируются, и в функции используются их локальные копии. Исключение составляют статические массивы - для них создаётся переменная-указатель на первый элемент массива. Т.е. факт того, что переданная переменная имеет тип указателя, совсем не делает его изменяемым. Компилятору всё равно, какой ты тип передаёшь - правила одинаковы для всех. Поэтому, если ты хочешь что-то менять, передавай указатель на это - тогда из функции ты сможешь получить доступ к тому, на что он указывает. Если хочешь менять указатель - передавай указатель на него. Либо же передавай переменные по ссылкам. |
| gepar:
HoRRoR, ммм, тоесть у меня передаётся функции сам массив а, копия n и копия указателя ? |
| HoRRoR:
Про статические массивы я писал в предыдущем сообщении. Копия n и копия указателя - да, верно. |
| gepar:
Так это что получается что при желании обычный элемент я могу передать по ссылке в функцию для редактирования, а указатель - нет (нужно создавать указатель на указатель), так нИчестна :) |
| HoRRoR:
Что тебе мешает передать указатель по ссылке? Я ещё раз говорю - нет разницы, является ли тип передаваемого объекта указателем. Тип есть тип, это унифицированное понятие как для человека, так и для компилятора. |
| gepar:
HoRRoR,так а как это сделать? Если я буду передавать как третий аргумент при вызове функциии &pAbc то будет опять та ошибка с двойным указателем. Как тогда функции дать знать что ей будет передана ссылка на указатель подскажи пожалуйста ? |
| HoRRoR:
Эм... &переменная - взятие адреса, а не передача по ссылке. Ссылку в данном случае можно описать только в прототипе самой функции - int* &ref. Если в прототипе объявлена обычная переменная, но функции передаётся ссылка - толку от этого никакого. |
| gepar:
HoRRoR, я понял, читаю дальше Дейтела, я пока о &ref первый раз услышал :) Попробовал добавить в прототип приписку &ref не изменяя больше код - получил ошибку main.cpp||undefined reference to `maximum(int*, int, int*&)'| В общем наверное стоит ещё почитать Дейтела дальше чтобы понять как пользоваться этой &ref. |
| HoRRoR:
Не понял, что, как и куда ты приписал. Код покажи. |
| gepar:
В прототипе исользуемой функции получилось: int maximum(int [], int, int* &ref); Но я уже и так понял что нужно продолжать читать Дейтела, рановато я решил баловаться указателями, когда не все фишки связанные с ними знаю. |
| HoRRoR:
Объявлено всё правильно, ты при вызове что-то намудрил, видимо, что функция с соответствующим прототипом не найдена. Покажи код вызова и объявления передаваемых переменных. |
| gepar:
HoRRoR, ну всё остальное я оставил как и было, те: --- Код: ---int maximum(int [], int, int* &ref); //прототип maximum ... int main() { int *pAbc; int max; ... max=maximum (a,n,pAbc); cout<<"abc="<<*pAbc; return 0; } int maximum(int a[], int n, int *abc) { int max=0; abc=&a[0]; for (int i=0;i<n;i++) if (a[i]>*abc) abc=&a[i]; for (int i=0; &a[i]!=abc;i++) max+=a[i]; abc=&a[9]; return max; } --- Конец кода --- |
| Навигация |
| Главная страница сообщений |
| Следующая страница |
| Предыдущая страница |