Russian Qt Forum
Май 15, 2024, 15:41 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Ошибка: multiple definition of  (Прочитано 9604 раз)
gidrowolf
Гость
« : Июнь 14, 2011, 10:51 »

После долгого перерыва в программировании вроде как обычно создаю класс и получаю такие ошибки:
Код:
debug/mainwindow.o: In function `Test':
F:\Projects\TEST-build-desktop/../TEST//test.h:10: multiple definition of `Test::Test()'
debug/main.o:F:\Projects\TEST-build-desktop/../TEST//test.h:10: first defined here
debug/mainwindow.o: In function `Test':
F:\Projects\TEST-build-desktop/../TEST//test.h:10: multiple definition of `Test::Test()'
debug/main.o:F:\Projects\TEST-build-desktop/../TEST//test.h:10: first defined here
debug/moc_mainwindow.o: In function `Test':
F:\Projects\TEST-build-desktop/debug//../../TEST/test.h:10: multiple definition of `Test::Test()'
debug/main.o:F:\Projects\TEST-build-desktop/../TEST//test.h:10: first defined here
debug/moc_mainwindow.o: In function `Test':
F:\Projects\TEST-build-desktop/debug//../../TEST/test.h:10: multiple definition of `Test::Test()'
debug/main.o:F:\Projects\TEST-build-desktop/../TEST//test.h:10: first defined here
collect2: ld returned 1 exit status
mingw32-make[1]: *** [debug\TEST.exe] Error 1
mingw32-make: *** [debug] Error 2

test.h:
Цитировать
#ifndef TEST_H
#define TEST_H

class Test
{
public:
    Test();
};

Test::Test()
{

}

#endif // TEST_H

В mainwindow.h добавлены только две строки:
Цитировать
#include "test.h"
Test test;
Остальное стандартный шаблон.

В вложении сам проект.
Записан
BRE
Гость
« Ответ #1 : Июнь 14, 2011, 10:56 »

Код
C++ (Qt)
inline Test::Test()
{
 
}
 
Записан
gidrowolf
Гость
« Ответ #2 : Июнь 14, 2011, 11:02 »

Код
C++ (Qt)
inline Test::Test()
{
 
}
 
Огромное спасибо.
А с чем это связано? Я что-то пропустил? Просто раньше оно и так компилилось. Я даже щас заглянул в книгу "Джесс Либерти" там без inline везде написано.
Записан
BRE
Гость
« Ответ #3 : Июнь 14, 2011, 11:06 »

Всегда нужно было писать, если реализацию методов пишешь в заголовочном файле.
Записан
gidrowolf
Гость
« Ответ #4 : Июнь 14, 2011, 11:20 »

Всегда нужно было писать, если реализацию методов пишешь в заголовочном файле.

Понятно, я этого не знал. Просто раньше все в самом классе писал, а щас решил вынести реализацию из класса и не мусорить.
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #5 : Июнь 14, 2011, 11:29 »

Просто раньше все в самом классе писал, а щас решил вынести реализацию из класса и не мусорить.
Ну так в *.cpp б и выносили.
А так сейчас вы место того, что бы не мусорить, переложили мусор из одного угла комнаты в другой.
Записан
Fess
Гость
« Ответ #6 : Июнь 14, 2011, 12:49 »

освежите в памяти как компилируются и линкуются программы на С++
компилятор обрабатывает только cpp файлы
вы описали функцию в h файле и она попала в несколько разных cpp через #incude
каждый cpp был отдельно откомпилирован в объектный файл, но линкер не смог их всех собрать, поскольку оказалось несколько функций с одной сигнатурой. Какую из них следует вызывать - непонятно.
Если вы выносите тело функции в cpp файл, то в h у вас остается только объявление функции, и у линкера проблем не возникает, поскольку код этой функции существует в единственном числе в одном только объектном файле.
вариант с inline тоже прокатывает, поскольку компилятор подставит код функции в место вызова и линкер вообще не будет знать, что таковая существует. Но нужно ли это вам - вопрос отдельный.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.09 секунд. Запросов: 23.