1

Тема: declaration of 'operator()' as non-function

Всіх з приходом 2018 року!  Будь ласка, подивіться, повідомлення про помилку я не зрозумію, не зрозумію що не так. Не бачу. А як же треба?

Ось тут

    int operator()
    {
        if(0 == strcmp(c,"stop"))
        {
            II = 1;
            return II;
        }
    }

ostream_operator2.cpp|29|error: declaration of 'operator()' as non-function|

#include <iostream>

class cls
{
    char c;
    int i;
  public:
    cls(char C = 0, int I = 0) : c(C), i(I)
    {}
    friend std::ostream& operator<< (std::ostream &out, cls &obj)
    {
        out<<obj.c<<"  "<<obj.i;
        return out;
    }
    friend std::istream& operator>> (std::istream &in, cls &obj)
    {
        in>> obj.c >> obj.i;
        return in;
    }

    int operator()
    {
        if(0 == strcmp(c,"stop"))
        {
            II = 1;
            return II;
        }
    }

};

int II=0;


main()

{
  cls s('a',10),ss(' ',0);
  std::cout<<"abc"<<std::endl;
  std::cout<<s<<ss<<std::endl;

  foreah ( ; II == 0; ss )
  {
     std::cin >> ss;
     std::cout<<ss<<std::endl;
  }

  return 0;
}

2 Востаннє редагувалося koala (04.01.2018 19:54:13)

Re: declaration of 'operator()' as non-function

int operator()//визначення operator() типу "int"
int operator()()//визначення operator() типу "функція, що повертає int"

Плутанина через те, що те, що ми визначаємо, зветься "operator()" - тобто це не звичайний ідентифікатор.

Подякували: sensei, М18х00, leofun013

3

Re: declaration of 'operator()' as non-function

Там ще купа помилок і нелогічностей, але оскільки ви про них не питали, то я й не розписую.

4

Re: declaration of 'operator()' as non-function

Розпишіть. Я можу сам й не побачіти. Буду вдячний.

А що йому в цьому виразі не подобається?

cls& operator()()
    {
        if(0 == strcmp(c,"stop"))
        {
            II = 1;
        }
        return this;
    }

invalid initialization of non-const reference of type 'cls&' from an rvalue of type 'cls*'|

5

Re: declaration of 'operator()' as non-function

Тобто якщо я не плутаю, начебто все таке раніше проходило...

6

Re: declaration of 'operator()' as non-function

Ось і з'явився баг. Як тільки я вводжу більше однієї літери поспіль програма йде в нескінченний цикл.

#include <iostream>
#include <cstring>
#include <algorithm>

int II=0;

class cls
{
    char c;
    int i;
  public:
    cls(char C = 0, int I = 0) : c(C), i(I)
    {}
    friend std::ostream& operator<< (std::ostream &out, cls &obj)
    {
        out<<obj.c<<"  "<<obj.i;
        return out;
    }
    friend std::istream& operator>> (std::istream &in, cls &obj)
    {
        in>> obj.c >> obj.i;
        return in;
    }

    cls& operator()()
    {
        if(0 == strcmp(c,"stop"))
        {
            II = 1;
        }
        return *this;
    }

};




main()

{
  cls s('a',10),ss(' ',0);
  std::cout<<"abc"<<std::endl;
  std::cout<<s<<ss<<std::endl;

  for ( ; II == 0; ss )//_each
  {
     std::cin >> ss;
     std::cout<<ss<<std::endl;
  }

  return 0;
}

7

Re: declaration of 'operator()' as non-function

Будь ласка, вивід компілятора надайте. З усіма попередженнями. Попередження не просто так робляться.

8 Востаннє редагувалося М18х00 (08.01.2018 00:20:48)

Re: declaration of 'operator()' as non-function

Дякую!     Будь ласка.
Питання в тому, що такої саме поведінки я не чекав. Якщо я вводжу наприклад F і 3,
програма слухняно чекає введення. А якщо FF і 3, то вже йде в нескінченний цикл.
І ні що б 2 рази прокрутитися, її клінить.

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

Відстежити роботу потоку відладчиком я теж не бачу як.

#include <iostream>
#include <cstring>
#include <algorithm>

int II=0;

class cls
{
    char c;
    char *cc;
    int i;
  public:
    cls(char C = 0, int I = 0) : c(C), i(I), cc(0)
    {}
    cls(char *CC = 0, int I = 0) : c(0), i(I), cc(CC)
    {}
    friend std::ostream& operator<< (std::ostream &out, cls &obj)
    {
        out<<obj.c<<"  "<<obj.i;
        return out;
    }
    friend std::istream& operator>> (std::istream &in, cls &obj)
    {
        in>> obj.c >> obj.i;
        return in;
    }

    cls& operator()()
    {
        if(0 == strcmp(c,"stop"))
        {
            II = 1;
        }
        return *this;
    }

};




main()

{
  cls s('a',10),ss(' ',0);
  std::cout<<"abc"<<std::endl;
  std::cout<<s<<ss<<std::endl;

  for ( ; II == 0; ss )//_each
  {
     std::cin >> ss;
     std::cout<<ss<<std::endl;
  }

  return 0;
}





||=== Build: Debug in ostream_operator2 (compiler: GNU GCC Compiler) ===|
E:\ZZ\ostream_operator2\ostream_operator2.cpp||In constructor 'cls::cls(char, int)':|
E:\ZZ\ostream_operator2\ostream_operator2.cpp|12|warning: 'cls::i' will be initialized after [-Wreorder]|
E:\ZZ\ostream_operator2\ostream_operator2.cpp|11|warning:   'char* cls::cc' [-Wreorder]|
E:\ZZ\ostream_operator2\ostream_operator2.cpp|14|warning:   when initialized here [-Wreorder]|
E:\ZZ\ostream_operator2\ostream_operator2.cpp||In constructor 'cls::cls(char*, int)':|
E:\ZZ\ostream_operator2\ostream_operator2.cpp|12|warning: 'cls::i' will be initialized after [-Wreorder]|
E:\ZZ\ostream_operator2\ostream_operator2.cpp|11|warning:   'char* cls::cc' [-Wreorder]|
E:\ZZ\ostream_operator2\ostream_operator2.cpp|16|warning:   when initialized here [-Wreorder]|
E:\ZZ\ostream_operator2\ostream_operator2.cpp||In member function 'cls& cls::operator()()':|
E:\ZZ\ostream_operator2\ostream_operator2.cpp|31|warning: invalid conversion from 'char' to 'const char*' [-fpermissive]|
c:\mingw\include\string.h|43|note: initializing argument 1 of 'int strcmp(const char*, const char*)'|
E:\ZZ\ostream_operator2\ostream_operator2.cpp||In function 'int main()':|
E:\ZZ\ostream_operator2\ostream_operator2.cpp|50|warning: for increment expression has no effect [-Wunused-value]|
||=== Build finished: 0 error(s), 8 warning(s) (0 minute(s), 44 second(s)) ===|
||=== Run: Debug in ostream_operator2 (compiler: GNU GCC Compiler) ===|
Post's attachments

ostream_operator2.zip 292.97 kb, 259 downloads since 2018-01-07 

9 Востаннє редагувалося М18х00 (08.01.2018 00:58:32)

Re: declaration of 'operator()' as non-function

Я майже зовсім не уявляю що воно той потік. Де подивитися джерельні коди?

10

Re: declaration of 'operator()' as non-function

А тепер дивіться: 6 -Wreorder - це дрібниця, але і виправляється миттєво. Просто ставте ініціалізатори c, cc та i порядку їхнього проголошення:

cls(char C = 0, int I = 0) : c(C), cc(0), i(I)

А от invalid conversion from 'char' to 'const char*' - це вже серйозно. Дивимося на той рядок:

if(0 == strcmp(c,"stop"))

Що таке c? Це char, тобто знакове ціле довжиною в 1 байт, від -128 до 127. А які аргументи приймає strcmp? Правильно - два ВКАЗІВНИКИ на char. Тобто якщо ви вводите F, то в c буде значення 70 (код ASCII літери F), а в strcmp буде передана адреса зі значенням 70. Що саме знаходиться за цією адресою - ви не знаєте, от і виходить якась дурня. Як виправити це правильно - залежить від того, що саме ви хочете зробити, але ж ви нам цього не сказали, так що підказати не можу.
Ну і останнє - for increment expression has no effect:

for ( ; II == 0; ss )//_each

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

for ( ; II == 0; )//_each

чи навіть заміните на while

while( II == 0 )//_each

то нічого не зміниться, а попередження вже не буде.

Подякували: 0xDADA11C7, leofun01, М18х00, unseen4

11

Re: declaration of 'operator()' as non-function

Дякую!     for ( ; II == 0; ss ) це я забажав зробити вихід з циклу.

12

Re: declaration of 'operator()' as non-function

Так, хай навить цикл while нескінчений. Чому, чому std::cout<<ss<<std::endl; не завжди чекає введення чогось? Але ж повинна? Не розумію!

13

Re: declaration of 'operator()' as non-function

Гаразд, дуже пізня година, я правда може вже дивлюся і не тямлю.

14

Re: declaration of 'operator()' as non-function

cout виводить, cin вводить. На що має чекати cout?

15

Re: declaration of 'operator()' as non-function

Я очікував що програма буде неодмінно чекати введення ентер. Я не знаю чому але так завжди відбувалося.
Якщо я ввів не один символ а два ( або пять ) підряд, тільки після натискання ентер відбувається enter.

Я міг очікувати, що 1) буде прийнятий один символ а решта загубляться.
2) швидше за все, напевно, один символ буде витягнутий з ,,потоку,,. Наступний по ходу символ буде
витягнутий далі по ходу програми, а в нашому прикладі на другому (наступному) кільці циклу.

А тут відбувається те що я не міг очікувати. Як я далі можу програмувати якщо я не розумію що відбувається?
А я не розумію зовсім.

Спробуйте ввести самі в консоль моєї програми два символи поспіль і ви побачите цей ефект.

16

Re: declaration of 'operator()' as non-function

А ви вже виправили попередження? Покажіть виправлений код. Бо якщо ви про невиправлений, то виходить, що я дарма вам казав його виправити, а там є суттєві зауваження; а якщо про виправлений, то я не телепат і не знаю, як саме ви його виправили.

17 Востаннє редагувалося Alchimic (30.01.2018 10:23:02)

Re: declaration of 'operator()' as non-function

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