170 похожих чатов

Подскажите пожалуйста, , как сделать class method который бы имел

доступ к объектам класса без создания экземпляра?
#include <iostream>
class Universe {
private:
int the_answer {42};

public:
static void static_method() {
std::cout << "I am a pure static method" << std::endl;
}

void class_method() {
std::cout << " I would like to know the_answer" << std::endl;
std::cout << the_answer << std::endl;
}
};
int main()
{
Universe::static_method();
Universe::class_method(); // error: call to non-static member function without an object argument
return 0;
}

39 ответов

5 просмотров

передавай экземпляр в static метод

int the_answer{42} - это поле объекта, а не класса, поэтому нужен объект static int the_answer - другой разговор

Никак

Nastya-Medveda Автор вопроса
Alexander Karaev
int the_answer{42} - это поле объекта, а не класса...

Спасибо разобралась. Но чтоб я могла инициализировать мне надо сделать его const так как иначе мне придется инициализировать его в конструкторе, которого у метода класса нет.

Nastya-Medveda Автор вопроса
Serhii Herashchenko
Нет, не надо

а как тогда? без const оно выдает ошибку: error: non-const static data member must be initialized out of line

Nastya Medveda
Спасибо разобралась. Но чтоб я могла инициализиров...

Можно и не const, просто начальное значение должно быть хоть каким-нибудь. И для C++17 хватит inline static int the_answer = XXX;, чтобы не писать ужасы вне класса

Nastya Medveda
а как тогда? без const оно выдает ошибку: error: ...

Если перевести ошибку, то станет понятно, что это не "нельзя", а "можно, но.."

Nastya-Medveda Автор вопроса
Alexander Karaev
Можно и не const, просто начальное значение должно...

Спасибо. С inline работает. Пошла разбираться что же значит inline применимо к методам класса.

Nastya Medveda
Спасибо. С inline работает. Пошла разбираться чт...

Сейчас скину отличный доклад по модификаторам

Nastya-Medveda Автор вопроса

Это как вот так? Если объект класса это и есть экземпляр? То есть ты спрашиваешь "Как сделать метод класса, который бы имел доступ к объектам этого класса, которые мы никогда не будем создавать и которые не существуют?"

Nastya-Medveda Автор вопроса
Ilya Zviagin
Это как вот так? Если объект класса это и есть экз...

именно. Мы там выше уже разобрались как так сделать.

Ну, надо class_method тут тоже сделать static, оно будет работать, но только никаких объектов-экземпляров не будет

Это умеет только статический метод. Такой метод может обращаться только к статическим полям класса

Ilya Zviagin
Это как вот так? Если объект класса это и есть экз...

А эт нормально инизиал. переменную в классе ?

Nastya Medveda
Спасибо. С inline работает. Пошла разбираться чт...

Гспди, как жалко то тебя, как всё в твоей голове -то перепутано...

Ilya Zviagin
Гспди, как жалко то тебя, как всё в твоей голове -...

да распутается, все нормально будет, если ей это действительно нужно)

Kirill 🚜
А разве constexpr не лучше в этой ситуации?

constexpr включает в себя const в этом контексте

Ilya Zviagin
Ну, надо class_method тут тоже сделать static, оно...

если я правильно понял, она пыталась найти аналог декоратора classmethod и staticmethod из питона

Kirill 🚜
А разве constexpr не лучше в этой ситуации?

и до C++17 static constexpr не включает inline, что может привести к чудесным чудесам при инициализации переменной внутри класса..

Alexander Karaev
constexpr включает в себя const в этом контексте

А она хочет менять в будущем эту переменную или что?

Ilya Zviagin
Где, как?

#include <iostream> class Universe { private: int the_answer {42}; public: static void static_method() { std::cout << "I am a pure static method" << std::endl; } void class_method() { std::cout << " I would like to know the_answer" << std::endl; std::cout << the_answer << std::endl; } }; int main() { Universe::static_method(); Universe::class_method(); // error: call to non-static member function without an object argument return 0; }

Alexander Karaev
она сказала, что не хочет const

Складывается впечатление что она хочет сделать что-то неправильное, если честно

Nastya Medveda
именно его

Настя, вот прежде всего, НЕ НАДО искать какие-то аналоги из других языков в изучаемом языке. ООП ВЕЗДЕ РАЗНОЕ!

Nastya Medveda
именно его

тут я вряд ли подскажу тогда, сам не юзал classmethod, но предположу, что ввиду разлчных реализаций подходов к ООП, он либо не принесет в с++ пользы, либо просто не является фичей первой необходимости. Скорее всего первое

Nastya Medveda
именно его

класс в С++ не является объектом

Alexander Karaev
класс в С++ не является объектом

+, точно) че-то сразу не подумал

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Гайс, вопрос для разносторонее развитых: читаю стрим с юарта, нада выделять с него фреймы с определенной структурой, если ли чо готовое, или долбаться с ринг буффером? нада у...
Vitaly
9
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
длина пакета фиксированная, или меняется?
Okhsunrog
7
Карта сайта