Перегрузка конструктора. Ошибка multiple definition of `Tile::Tile()' и других реализаций

250
07 сентября 2017, 18:48

Что не так с реализацией, почему пишет "множественное определение" всех методов за классом? Пишу в QtCreator.

class Tile {
public:
    // Constructor
    Tile();
    Tile(char c, char r);
    char getCol() const;
    char getRow() const;
    bool valid() const;
private:
    char col_, row_;
};
Tile::Tile()
    : col_(0), row_(0) { }
Tile::Tile(char c, char r)
    : col_(c), row_(r) { }
char Tile::getCol() const{
    return col_;
}
char Tile::getRow() const{
    return row_;
}
bool Tile::valid() const{
    return col_;
}

Answer 1

Наверняка вы все это поместили в заголовочном файле, который включается во многие файлы проекта...

В заголовочном файле должны находиться только объявления. Реализация может там находиться, только если она - inline, т.е. если тела функций находятся в самом объявлении класса (или объявлены вне него как inline).

Иначе нарушается ODR - правило одного определения...

Судите сами - при компиляции, скажем, всего двух .cpp-файлов с таким заголовочным файлом в каждом будет код всех функций вашего класса. С одинаковыми именами. И что делать линковщику - какой из них оставить в выполнимой программе? Какой выбросить?

Вот он, бедный, и жалуется на жизнь...

READ ALSO
std::forward в нешаблонной функции

std::forward в нешаблонной функции

Есть функция, принимающая rvalue ссылку и передающая её другой функции, принимающей rvalue ссылку:

257
Заполнение qtablewidget runtime

Заполнение qtablewidget runtime

Есть проект, в нем обрабатывает внешняя библиотека, у которой есть функции обратного вызоваКогда происходит событие функция обратного вызова...

370
Получение температуры процессора C++ WMI Qt

Получение температуры процессора C++ WMI Qt

На строке hr = pEnum->Next(WBEM_INFINITE, 1, &pObject, &returned); выкидывает ошибку IDispatch error #3587, почему это происходит и как это можно исправить?

510
C++ Антивирусник не дает скачивать файлы

C++ Антивирусник не дает скачивать файлы

Имеется программа которая просто скачивает файл и записывает на рабочий стол, все хорошо программа скачивает, но вот в чем проблема антивирусник...

330