Другое > 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;
}

--- Конец кода ---
Навигация
Главная страница сообщений
Следующая страница
Предыдущая страница

Перейти к полной версии