1 Востаннє редагувалося М18х00 (20.11.2017 20:28:00)

Тема: postfix 'A A::operator++(const A&)' must take 'int' as its argument??

Усім доброго часу доби!

Ось така помилка error : postfix 'A A::operator++(const A&)' must take 'int' as its argument|

Я звичайно знаю про postfix і prefix щодо I++ або ++I, але до чого int? Що  не так?


А, звиняйте, будь ласка, от

A operator++ (const A & a)
{
    size_t _dl = dl_Obj();
    _dl =  _dl + a.dl_Obj();
    char *ch1, *ch2; 
    ch1 = ch;    ch2 = ch_Obj(); 
    ch = new char[_dl+1];
    size_t i=0
    for(; ch1[i]; i++)
    {
        ch[i] = ch1[i];
    }
    for(; ch2[i]; i++)
    {
        ch[i] = ch1[i];
    }
    
    ch[dl+1] = '0';
    
    if (ch1 !=NULL) { delete ch1; ch1 = NULL;}
    
    return *this;        
}

До речі, які книги можливо почитати? Англійською - не виключно, але надзвичайно небажано..
Я її можу використовувати скоріше як довідку коли я вже все знаю в цілому.

2

Re: postfix 'A A::operator++(const A&)' must take 'int' as its argument??

Мабуть, Ви описали префіксний, а використали як постфіксний чи ще щось таке.
Щоб розрізнити, постфіксний має додатковий аргумент типу int.

class A
{
public:
    const A& operator++();    // префіксний
    const A& operator++(int); // постфіксний
};
Подякували: М18х00, koala, leofun013

3 Востаннє редагувалося М18х00 (20.11.2017 20:33:14)

Re: postfix 'A A::operator++(const A&)' must take 'int' as its argument??

Дякую!   Зараз..  A& чі A - яка принципова різниця?

По-друге, мене ж не int потрібен. Мені його, будь-що, в параметрах вписати ( поруч з A& а) чі що?

4 Востаннє редагувалося ReAl (20.11.2017 21:22:58)

Re: postfix 'A A::operator++(const A&)' must take 'int' as its argument??

Ну ось, російською, один запит гуглу.  Лише здається, на другій сторінці пошуку.
Книжка неправильна, нижче по темі приклад як треба.

Подякували: М18х001

5

Re: postfix 'A A::operator++(const A&)' must take 'int' as its argument??

Дякую!! бачу!

6

Re: postfix 'A A::operator++(const A&)' must take 'int' as its argument??

A& чі A - яка принципова різниця?

A& - це посилання, замаскований вказівник. Якщо A - велика структура даних, має сенс передавати посилання на неї.
Параметр int не використовується, він потрібен, щоб розрізняти префіксну (++I) і постфіксну (I++) форми. В другій є зайвий параметр типу int, який, ще раз, не використовується.

Подякували: М18х001

7 Востаннє редагувалося ReAl (20.11.2017 21:15:39)

Re: postfix 'A A::operator++(const A&)' must take 'int' as its argument??

М18х00 написав:

Дякую!   Зараз..  A& чі A - яка принципова різниця?

По-друге, мене ж не int потрібен. Мені його, будь-що, в параметрах вписати ( поруч з A& а) чі що?

Пардон, копіпаст, висмикнули від компа, недоредагував.

Різницю A і A& вже пояснили.

Конкретно тут:
• Постфіксний має повертати A, бо і він повертає значення до інкременту (яке треба спочатку десь зберегти, це буде тимчасовий об'єкт, який не можна передати через ref).
• Префіксний модифікує об'єкт до того, як повернути значення, тому може повертати і A&.

Подякували: М18х001

8 Востаннє редагувалося ReAl (20.11.2017 21:23:23)

Re: postfix 'A A::operator++(const A&)' must take 'int' as its argument??

ReAl написав:

Ну ось, російською, один запит гуглу.  Лише здається, на другій сторінці пошуку.

Книжку викинути. Вони там у постфіксному повертають об'єкт після інкременту. Реально там що пер-, що пост-фіксний мають однакову поведінку — префіксного.

Треба так

Подякували: М18х001

9

Re: postfix 'A A::operator++(const A&)' must take 'int' as its argument??

ReAl написав:

Треба так

Так точно не треба. Канонічна форма реалізації постфіксного і префіксного інкрементів:

class A
{
public:
    int a_;

public:
    explicit A(int i) : a_(i) {}

    A& operator++()
    {
        ++a_;
        return *this;
    }

    A operator++(int)
    {
        A temp(*this);
        ++*this;
        return temp;
    }
};
Подякували: М18х00, ReAl2

10

Re: postfix 'A A::operator++(const A&)' must take 'int' as its argument??

М18х00 написав:

До речі, які книги можливо почитати?

http://diamail.com.ua/book/6152.html

Подякували: М18х001

11

Re: postfix 'A A::operator++(const A&)' must take 'int' as its argument??

Надзвичайно дякую!!  Зрозуміло!  Так гарно всі разом пояснили.

Хотів першу мить написати  ,, особливо дякую ReAl ,, але ж і Reinterpret, і koala, всі пояснили саме разом.

Подякували: 0xDADA11C71

12 Востаннє редагувалося ReAl (05.12.2017 17:02:41)

Re: postfix 'A A::operator++(const A&)' must take 'int' as its argument??

Reinterpret написав:

Так точно не треба. Канонічна форма реалізації постфіксного і префіксного інкрементів:

Давайте зійдемося на тому, що точно не треба так, як у книжці, на яку я перше посилання дав, бо там нема взагалі пост-інкременту, натомість ще один пре-інкремент.

А так, як я написав — краще не треба, бо криво.