Класс в отдельном файле.
От: Zender  
Дата: 17.01.10 12:08
Оценка:
Помогите, что я упускаю?
Хочу поместить класс в отдельный файл, а потом его присоединять к проекту. Но выскакивают ошибки:

Ошибка    1 error LNK2005: "public: __thiscall myclass::myclass(void)" (??0myclass@@QAE@XZ) уже определен в dd.obj
Ошибка    2 error LNK2005: "private: void __thiscall myclass::func(void)" (?func@myclass@@AAEXXZ) уже определен в dd.obj
Ошибка    3 fatal error LNK1169: обнаружен многократно определенный символ - один или более


А когда класс в файле с функцией main, то всё нормально.
Вот, что получается меня

main.cpp:
#include <iostream>
#include "class.cpp"
using namespace std;
int main()
{
    myclass a;
    cout << a.i;
    return 0;
}


class.cpp:
#include <iostream>
using namespace std;

class myclass {
public:
    myclass();
    int i;
};
myclass::myclass() {i = 3;}
Re: Класс в отдельном файле.
От: SaZ  
Дата: 17.01.10 12:32
Оценка:
Здравствуйте, Zender, Вы писали:

Z>Помогите, что я упускаю?

Z>Хочу поместить класс в отдельный файл, а потом его присоединять к проекту. Но выскакивают ошибки:
Z>...

Правильнее будет вынести описание класса в отдельный .h (или .hpp) файл и подключать в нужных местах уже его. За исключением тех случаев, когда ваши классы шаблонные.

В самом файле с описанием класса сделать что-то вроде:

#ifndef SOME_UNIQUE_ID
#define SOME_UNIQUE_ID

// Описание класса
// ...

#endif


Для многих компиляторов вместо этого достаточно в начале файла написать #pragma once
Re[2]: Класс в отдельном файле.
От: Zender  
Дата: 17.01.10 12:39
Оценка:
SaZ>Правильнее будет вынести описание класса в отдельный .h (или .hpp) файл и подключать в нужных местах уже его. За исключением тех случаев, когда ваши классы шаблонные.

Спасибо. Заработало.
Вот ещё темку нагуглил http://www.sql.ru/forum/actualthread.aspx?tid=424986
Re: Класс в отдельном файле.
От: servancho Россия https://dedis.ru
Дата: 17.01.10 19:22
Оценка:
Здравствуйте, Zender, Вы писали:

Z>Помогите, что я упускаю?

Z>Хочу поместить класс в отдельный файл, а потом его присоединять к проекту. Но выскакивают ошибки:

Z>
Z>Ошибка    1 error LNK2005: "public: __thiscall myclass::myclass(void)" (??0myclass@@QAE@XZ) уже определен в dd.obj
Z>Ошибка    2 error LNK2005: "private: void __thiscall myclass::func(void)" (?func@myclass@@AAEXXZ) уже определен в dd.obj
Z>Ошибка    3 fatal error LNK1169: обнаружен многократно определенный символ - один или более
Z>


Z>#include "class.cpp"


У тебя определение тела функции появилось в нескольких obj-файлах (т.к. определено в class.cpp и везде куда включен class.cpp) и как линкер должен догадаться с чем линковать? Прочитай сообщение об ошибке более внимательно. В понимании текста ошибки так же поможет знание того чем отличается объявление от определения.
Если руки золотые, не важно из какого места они растут.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.