Я знаю … основы как-то, но я не понимаю. Я прочитал, что могу поместить определение своей функции в мой заголовок и затем включить его. Я никогда этого не делал, потому что мне нравилось мое определение в файле .cpp, отдельное от его объявления в заголовочном файле.
Теперь у меня было только две функции, и я не хочу дополнительный файл для этих определений.
header.h
const QString reviewToString(const int); //Declaration - do I even need it now?
const QString statusToString(const int); //Declaration - do I even need it now?
const QString reviewToString(const int r) //Definition
{
switch(r)
{
case 0:
return "Excellent";
case 1:
return "Great";
case 2:
return "Okay";
case 3:
return "Poor";
case 4:
return "Terrible";
default:
return "Unknown";
}
}
const QString statusToString(const int s) //Definition
{
switch(s)
{
case 0:
return "Watched";
case 1:
return "Bought";
default:
return "Not Watched";
}
}
Это выдержка из моего заголовочного файла. Я получил немного другого enum
с и struct
s, но они не так важны для этих функций, потому что они просто переводят целое число в QString, которая будет отображаться где-то еще. У меня также есть охрана включения.
Теперь я получаю тонны ошибок, подобных этой:
множественное определение `reviewToString (int) ‘
Это почему? Почему я не могу просто объявить и / или определить их в этом заголовке?
Вам нужно добавить inline
к определению. Без этого каждая единица перевода создаст свою собственную копию, и компоновщик не будет знать, что они должны быть дубликатами, и что ему разрешено выбрасывать все, кроме одной из этих копий.
А еще лучше, не добавляйте определение в заголовок, достаточно декларации. Переместить реализацию в собственный модуль перевода (.cpp
-файл). Вам не нужно inline
там, и это имеет множество преимуществ, которые становятся все более и более важными по мере роста вашего проекта.
Проблема здесь заключается в Одно Правило Определения. (Стандарт C ++ §3.2)
По сути, вы не можете иметь несколько определений для функции во всей вашей программе. Однако вы можете сделать функции inline
(в противном случае вам придется поместить их в .cpp
файл).