1 / 1 / 0
Регистрация: 08.04.2021
Сообщений: 88
1

Статическая функция в cout

11.05.2021, 11:11. Показов 476. Ответов 18
Метки нет (Все метки)

Здравствуйте!
Есть два принципиально одинаковых кода, имеющих не принципиальные различия в названиях переменных и т.п.
В одном, статическая функция, помещаемая в cout показывает адрес переменной, содержащейся в её теле, а в другом коде, VS-2019 показывает ошибку красным подчеркиванием. На скриншотах видно. Ну, то есть делается полностью то же самое в двух программах, а результат разный. В комментах кода описываются действия и результаты.
Сначала покажу рабочий код со скрином, где в консоли результат программы. А после не работающий код и скрин с ошибкой.
Прошу знающих подсказать, в чем дело?
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
// statfunc.cpp
// Статические функции и ID объектов
#include <iostream>
using namespace std;
///////////////////////////////////////////////////////////
class gamma
{
private:
    static int total;       //всего объектов класса
                            //(только объявление)
    int id;                 //ID текущего объекта
public:
    gamma()                 //конструктор без аргументов
    {
        total++;              //добавить объект
        id = total;           //id равен текущему значению total
    }
    ~gamma()                //деструктор
    {
        total--;
        cout << "Удаление ID " << id << endl;
    }
    static void showtotal() // статическая функция
    {
        cout << "Всего: " << total << endl;
    }
    void showid()           // Нестатическая функция
    {
        cout << "ID: " << id << endl;
    }
};
//---------------------------------------------------------
int gamma::total = 0;       // определение total
///////////////////////////////////////////////////////////
int main()
{
    setlocale(LC_ALL, "RUS");
    gamma g1;
    gamma::showtotal();//показывает значение total
    cout << "\nручное шоу " << g1.showtotal<<endl;//показывает адрес памяти
    gamma g2, g3;
    gamma::showtotal();//показывает значение total
    cout << "\nручное шоу " << g2.showtotal;//показывает адрес памяти
    cout << "\nручное шоу " << g3.showtotal<<endl;//показывает адрес памяти
    cout << "++++++++++++++++++++\n";
    g1.showtotal;//показывает значение total
    g2.showtotal;//показывает значение total
    g3.showtotal;//показывает значение total
    cout << "\n+++++++++++++++++\n";
 
    g1.showid();//показывает значение ID
    g2.showid();//показывает значение ID
    g3.showid();//показывает значение ID
    cout << "----------конец программы----------\n";
    return 0;
}
Миниатюры
Статическая функция в cout  
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.05.2021, 11:11
Ответы с готовыми решениями:

Не компилируется статическая функция
Не компилируется статическая функция. Код:public: ... inline static void clearLog() {...

Статическая функция в шаблонном классе
Под windows все отлично работало, но под linux выдает ошибку : /home/stalker/Рабочий...

Функция Cout
Здравствуйте. Решил проверить,можно ли что-то сделать с функцией cout,а если точнее - каким-либо...

Не работает статическая функция в шаблонном классе
Под windows все отлично работало, но под linux выдает ошибку : /home/stalker/Рабочий...

18
1 / 1 / 0
Регистрация: 08.04.2021
Сообщений: 88
11.05.2021, 11:13  [ТС] 2
Вот не работающий код и скрин к нему. Смысл вопроса в том, что одинаковое применение статической функции в cout, даёт разный результат. Там нет ошибки, а тут есть.
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
// statdata.cpp
// статические данные класса
#include <iostream>
using namespace std;
//////////////////////////////////////////////////////////
class foo
{
private:
    static int count;        // общее поле для всех объектов
                             // (в смысле "объявления")
public:
    foo()                    // инкрементирование при создании объекта
    {
        count++;
    }
    int getcount()           // возвращает значение count
    {
        return count;
    }
   static void showcount()
    {
        cout <<"проверка"<< count << endl;
    }
};
//--------------------------------------------------------
int foo::count = 0;          // *определение* count
//////////////////////////////////////////////////////////
int main()
{
    setlocale(LC_ALL, "RUS");
    foo f1, f2, f3;            // создание трех объектов
    foo::showcount();//показывает значение count
    // каждый объект видит одно и то же значение
    cout << "Число объектов: " << f1.getcount() << endl;//показывает значение count
    cout << "Число объектов: " << f2.getcount() << endl;//показывает значение count
    cout << "Число объектов: " << f3.getcount() << endl;//показывает значение count
    f3.showcount();//показывает значение count
    cout << "Число объектов: " << f3.showcount() << endl;//должен показать адрес памяти
    return 0;
}
Миниатюры
Статическая функция в cout  
0
3653 / 2990 / 828
Регистрация: 25.03.2012
Сообщений: 11,025
Записей в блоге: 1
11.05.2021, 11:16 3
автор, срочно прекращай изучать классы.
Ты по-моему второй или третий урок в курсе по С++ пропустил: "Как вызываются функции"!
Цитата Сообщение от KAMLS Посмотреть сообщение
g1.showtotal;//показывает значение total
g2.showtotal;//показывает значение total
g3.showtotal;//показывает значение total
вообще-то вот так они вызываются.
C++
1
2
3
g1.showtotal();//показывает значение total
 g2.showtotal();//показывает значение total
 g3.showtotal();//показывает значение total
0
129 / 81 / 49
Регистрация: 10.01.2020
Сообщений: 293
11.05.2021, 11:16 4
KAMLS, у showcount возвращаемое void, так зачем же его в cout пропихивать? Тем более, что ошибка сама все обьясняет.
0
3653 / 2990 / 828
Регистрация: 25.03.2012
Сообщений: 11,025
Записей в блоге: 1
11.05.2021, 11:18 5
KAMLS, на скрине последнем тоже. абсолютное непонимание, как в С++ вызвать функцию.
Вот так это делается. Что такое cout? Ты понимаешь, что это объект, к нему применяется перегруженный оператор сдвига и.т.д.? И что он тут не нужен.
C++
1
f3.showcount();//всё, весь вывод написан внутри!
0
1 / 1 / 0
Регистрация: 08.04.2021
Сообщений: 88
11.05.2021, 11:22  [ТС] 6
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Ты понимаешь
Господа, Вы не внимательно читали вопрос. Тут нет вопроса о целесообразности такого кода.
Тут вопрос в том, почему одно и то же даёт различный результат. Для этого, заинтересовавшемуся человку, желающему увеличить свои познания в VS-2019 или показать свои познания, надо вникнуть в суть происходящего, а не пробежаться по верхушкам и увидеть, что в cout применяется не совсем то, что там должно быть.
При всём моём уважении.
0
3653 / 2990 / 828
Регистрация: 25.03.2012
Сообщений: 11,025
Записей в блоге: 1
11.05.2021, 11:26 7
Цитата Сообщение от KAMLS Посмотреть сообщение
Тут вопрос в том, почему одно и то же даёт различный результат.
как оно может "давать результат", если очевидно, что оно у тебя не компилируется? Вот я и комментирую твою логическую ошибку в коде, который работать не будет ни в каком варианте.
0
1 / 1 / 0
Регистрация: 08.04.2021
Сообщений: 88
11.05.2021, 11:29  [ТС] 8
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Вот я и комментирую твою логическую ошибку в коде
Но вам ведь предоставлено ДВА (!!) кода...
В одном из которых "логическая ошибка" вовсе ошибкой почему-то не считается и код работает и даёт РЕЗУЛЬТАТ.
Результат показан на скриншоте. Неправильное использование функции в cout просто показывает адрес переменной.
Правильное использование показывает значение переменной.
0
3653 / 2990 / 828
Регистрация: 25.03.2012
Сообщений: 11,025
Записей в блоге: 1
11.05.2021, 11:33 9
Цитата Сообщение от KAMLS Посмотреть сообщение
Но вам ведь предоставлено ДВА (!!) кода...
я комментирую последний, в котором "не работающий код и скрин к нему" во втором посте.
В нём ошибка, с которой он никогда не скомпилируется.
О каком результате может идти речь, если код ни адреса ни значения переменной не должен показывать???
Это просто ошибка.
Как он у тебя "показывает другой результат" я понятия не имею.
0
1 / 1 / 0
Регистрация: 08.04.2021
Сообщений: 88
11.05.2021, 11:42  [ТС] 10
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Как он у тебя "показывает другой результат" я понятия не имею
Это потому что у Вас нет подходящих знаний. Если бы они были, Вы в первом коде увидели бы точно такую же ситуацию и выявили причину, по которой при такой же ситуации во втором коде показывается ошибка. Именно к людям с такими, соответствующими знаниями, мой вопрос и направлен.
Не обижайтесь, у меня тоже таких знаний пока нет. Поэтому и вопрос. Не пишите пустое, дождитесь ответа знающих.
0
16082 / 8684 / 2120
Регистрация: 30.01.2014
Сообщений: 14,968
11.05.2021, 12:09 11
Цитата Сообщение от KAMLS Посмотреть сообщение
что одинаковое применение статической функции в cout, даёт разный результат. Там нет ошибки, а тут есть.
Нет тут "одинакового" применения.

В первом коде у вас написано
C++
1
cout << "\nручное шоу " << g3.showtotal<<endl;//показывает адрес памяти
А во втором
C++
1
cout << "Число объектов: " << f3.showcount() << endl;//должен показать адрес памяти
Разница в скобках. Это совершенно разные вещи.
0
3653 / 2990 / 828
Регистрация: 25.03.2012
Сообщений: 11,025
Записей в блоге: 1
11.05.2021, 12:10 12
Я не обижаюсь и не ВЫкаю тебе, кстати.
В первом коде нет той ошибки, которую ты совершаешь во втором, ты почему-то считаешь эти два кода эквивалентными, что не так. Ты упорно утверждаешь, что в первом коде такая же логическая ошибка, что не так.
Я тебе вроде чётко сказал, что она у тебя только во втором коде, ты это проигнорировал.

Затем ты почему-то утверждаешь, что второй код "показывает другой результат", что не так.
Ты точно не путаешь ошибку компиляции и неверный результат работы кода? Подозреваю что путаешь и не разбираешься в терминах, отсюда формулируешь вопрос неграмотно: "показывает результат" код - во как!
0
1 / 1 / 0
Регистрация: 08.04.2021
Сообщений: 88
11.05.2021, 12:43  [ТС] 13
Цитата Сообщение от DrOffset Посмотреть сообщение
Разница в скобках.
Верно, тут-то и ошибка. Спасибо.

Добавлено через 1 минуту
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
во как!
Ок. ТЫ
ЕСЛИ БЫ ты написал то , что написал, ДО DrOffset, я бы понял. А так, некрасиво...

Добавлено через 6 минут
Цитата Сообщение от DrOffset Посмотреть сообщение
g3.showtotal
Кстати, скажите пожалуйста, я правильно понимаю, что тут cout показывает адрес объекта?
0
16082 / 8684 / 2120
Регистрация: 30.01.2014
Сообщений: 14,968
11.05.2021, 12:56 14
Цитата Сообщение от KAMLS Посмотреть сообщение
Кстати, скажите пожалуйста, я правильно понимаю, что тут cout показывает адрес объекта?
Нет. Показывает адрес функции gamma::showtotal.

Хотя это довольно странно, то он печатает вам адрес. Потому что в стандартной библиотеке нет оператора для вывода адреса функции, поэтому использоваться должен ближайший подходящий для этого оператор для типа bool (ненулевой адрес неявно приводится к true). Т.е. печатать вам на консоль он должен число 1, а не адрес.
0
1 / 1 / 0
Регистрация: 08.04.2021
Сообщений: 88
11.05.2021, 13:04  [ТС] 15
Цитата Сообщение от DrOffset Посмотреть сообщение
Показывает адрес функции gamma::showtotal.
Ну, вот, печатает адрес...) Спасибо большое.
0
16082 / 8684 / 2120
Регистрация: 30.01.2014
Сообщений: 14,968
11.05.2021, 13:05 16
KAMLS, да, только не объекта, а функции.
0
1 / 1 / 0
Регистрация: 08.04.2021
Сообщений: 88
11.05.2021, 13:14  [ТС] 17
Цитата Сообщение от DrOffset Посмотреть сообщение
да, только не объекта, а функции.
Да, я понял, спасибо. Я ведь через объект вызываю функцию объекта, значит её и адрес. Полагаю, если бы без функции после точки была бы строка, то был бы адрес объекта.
0
16082 / 8684 / 2120
Регистрация: 30.01.2014
Сообщений: 14,968
11.05.2021, 13:16 18
Цитата Сообщение от KAMLS Посмотреть сообщение
Полагаю, если бы без функции после точки была бы строка, то был бы адрес объекта.
Что за строка?

Адрес объекта получаете так:
C++
1
cout << &g3 << endl;
0
1 / 1 / 0
Регистрация: 08.04.2021
Сообщений: 88
11.05.2021, 13:34  [ТС] 19
Цитата Сообщение от DrOffset Посмотреть сообщение
Что за строка?
Да не строка, операнд)))
Как адрес получить я знаю. Об уровне моего понимания и восприятия С++ можно выразить словами "получаю удовольствие от работы с указателями на указатели"). Сегодняшний глюк как и большинство у меня (не знаю как у других) от невнимательности. Вот не видел я этих скобок и всё тут!)))
И с адресом объекта я погорячился, в том плане, если в операнде после объекта не ставить точку с названием функции, то адрес объекта cout точно не покажет. Компилятор взбунтуется против разношерстного типа данных без уточнения и доступа к полям)
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.05.2021, 13:34
Помогаю со студенческими работами здесь

Дружественная статическая функция из другого класса
у меня есть класс Info , объект которого имеет поля ключ и значение , оба типа std::string...

Не компиллируется функция cout
В DevC++ не компиллируется программа с функцией cout. #include &lt;iostream.h&gt; int main() { ...

Ошибка: error C2129: статическая функция объявлена, но не определена
В помощь начинающим изучать C++ хочу подсказать реальную причину этой ошибки. Так как реально в...

Зачем нужна член-функция cout.setf?
Всем здравствуйте, у меня такой вопрос: Начал изучать программирование C++. Попался мне вот такой...

Нюансы ввода/вывода в Си и C++ (функция printf() и объект std::cout)
Добрый день. Интересует следующий вопрос: каким именно образом работает команда форматирование...

Cout <<endl; Что это значит? Если ничего нету в cout?
Здравствуйте ! Обьясните пожалуйста что значит cout &lt;&lt;endl; если он используется после цикла...


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru