Size: a a a

2021 February 23

ПК

Побитый Кирпич... in supapro.cxx
Gabriel
Окей, тогда у меня остался неразрешённый вопрос насчёт классов.
Ну вот пример:

header.h:

class Example
{
int methodOfExample();
}

header.cpp

Exmaple::methodOfExample()
{
return 11;
}

tu1.cpp:

#include <header.h>

tu2.cpp:

#include <header.h>

void main()
{
Example ex;
ex.methodOfExample();
}



Тут ведь не нужно в header.cpp делать inline для methodOfExample. Ведь мы можем сделать #include <header.h> в разные TU и ошибки не будет?
Если ты тут сделаешь methodOfExample inline, то у тебя будет ошибка как раз. Потому что определение inline функции должно быть доступно в точке вызова
источник

G

Gabriel in supapro.cxx
Побитый Кирпич
Если ты тут сделаешь methodOfExample inline, то у тебя будет ошибка как раз. Потому что определение inline функции должно быть доступно в точке вызова
Т.е. доступно в header.h файле?(там же и точка вызова)
источник

ПК

Побитый Кирпич... in supapro.cxx
Gabriel
Т.е. доступно в header.h файле?(там же и точка вызова)
Точка вызова у тебя в main, в tu2.cpp
источник

I

Ilya in supapro.cxx
Ilya
Всем привет. Подскажите, как реализовать
Есть каунтер -  
k = 1 
, начинающийся с единицы. Мне нужно в стринге выводить по порядку номера от 001 до 100. При этом важно, чтоб спереди сохранялся 0
буквально в двух словах, если сможете
источник

G

Gabriel in supapro.cxx
Побитый Кирпич
Точка вызова у тебя в main, в tu2.cpp
Понял. Такой ещё вопрос;


header.h:

class Example
{
int methodOfExample();
}

header.cpp

Exmaple::methodOfExample()
{
return 11;
}

tu1.cpp:

#include <header.h>

int foo()
{
Example ex;

ex.methodOfExample();
}


tu2.cpp:

#include <header.h>

void main()
{
Example ex;
ex.methodOfExample();
}

Так ведь мы можем сделать и всё будет работать.

Тогда зачем нам делать так:


header.h:

class Example
{
int methodOfExample();
}

inline Exmaple::methodOfExample()
{
return 11;
}

tu1.cpp:

#include <header.h>

int foo()
{
Example ex;

ex.methodOfExample();
}


tu2.cpp:

#include <header.h>

void main()
{
Example ex;
ex.methodOfExample();
}

Это не будет одно и то же?
источник

ПК

Побитый Кирпич... in supapro.cxx
Gabriel
Понял. Такой ещё вопрос;


header.h:

class Example
{
int methodOfExample();
}

header.cpp

Exmaple::methodOfExample()
{
return 11;
}

tu1.cpp:

#include <header.h>

int foo()
{
Example ex;

ex.methodOfExample();
}


tu2.cpp:

#include <header.h>

void main()
{
Example ex;
ex.methodOfExample();
}

Так ведь мы можем сделать и всё будет работать.

Тогда зачем нам делать так:


header.h:

class Example
{
int methodOfExample();
}

inline Exmaple::methodOfExample()
{
return 11;
}

tu1.cpp:

#include <header.h>

int foo()
{
Example ex;

ex.methodOfExample();
}


tu2.cpp:

#include <header.h>

void main()
{
Example ex;
ex.methodOfExample();
}

Это не будет одно и то же?
Во втором случае у тебя метод inline, в этом и разница
источник

G

Gabriel in supapro.cxx
Побитый Кирпич
Во втором случае у тебя метод inline, в этом и разница
Ну так я могу делать так как в первом? Это нормальный стиль?
источник

ПК

Побитый Кирпич... in supapro.cxx
Gabriel
Ну так я могу делать так как в первом? Это нормальный стиль?
Так обычно и делают
источник

G

Gabriel in supapro.cxx
Побитый Кирпич
Так обычно и делают
Окей. А второй метод применим только для случаев, когда мы хотим сделать определения в .h?
источник

ПК

Побитый Кирпич... in supapro.cxx
Gabriel
Окей. А второй метод применим только для случаев, когда мы хотим сделать определения в .h?
Да, можно просто в теле класса сделать, тоже будет inline считаться
источник

G

Gabriel in supapro.cxx
Побитый Кирпич
Да, можно просто в теле класса сделать, тоже будет inline считаться
Про это я понял сразу.
источник

ПК

Побитый Кирпич... in supapro.cxx
Gabriel
Окей. А второй метод применим только для случаев, когда мы хотим сделать определения в .h?
inline пишут, чтобы в header-е как раз писать определение. Например, чтобы header-only библиотеку сделать, которую не надо собирать для подключения.
источник

G

Gabriel in supapro.cxx
Побитый Кирпич
inline пишут, чтобы в header-е как раз писать определение. Например, чтобы header-only библиотеку сделать, которую не надо собирать для подключения.
Так а почему её собирать не надо?)
источник

ПК

Побитый Кирпич... in supapro.cxx
Gabriel
Так а почему её собирать не надо?)
Потому что весь код в header-ах - header-only библиотека
источник

G

Gabriel in supapro.cxx
Т.е. если код в ещё и в .cpp, то его нужно компилировать и делать из этого библиотеку?
источник

ПК

Побитый Кирпич... in supapro.cxx
Gabriel
Т.е. если код в ещё и в .cpp, то его нужно компилировать и делать из этого библиотеку?
В текущей мете да
источник

ПК

Побитый Кирпич... in supapro.cxx
В будущих патчах реализуют модули из С++20, там возможно что то поменяется
источник

G

Gabriel in supapro.cxx
А чем они различаются с тем, что есть сейчас?
источник

ПК

Побитый Кирпич... in supapro.cxx
Gabriel
А чем они различаются с тем, что есть сейчас?
Тем что модули это замена header-ам
источник

RM

Roy Mustang in supapro.cxx
Есть код для проверки структуры на наличие метода, вопрос такой, у меня метод update принимает аргумент int, а проверку я делаю через void_t, как мне в следующем коде сказать, что вот этот update кушает один аргумент int
std::void_t<decltype(std::declval<Type>().update())

Знаю, что можно передать просто 0, но есть ли универсальный способ или может можно как то сделать саму проверку универсальной?
источник