Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Подключение своих заголовочных файлов к проекту

4.8K
23 апреля 2004 года
disorder
17 / / 17.02.2004
Здравствуйте!
Проблема такая:
Написал свой заголовочный файл "BitPlane.h", в нем определил класс
class CBitPlane
{
public:
int m_Width, m_Height; // ширина и высота битовой плоскости в пикселах
DWORD **Color ; // массив точек плоскости


CBitPlane();
~CBitPlane();
};

конструктор

CBitPlane::CBitPlane()
{
m_Width = 640;
m_Height = 480;
Color = new DWORD*[m_Width];
for (int i = 0 ; i<m_Width ; i++)
Color = new DWORD[m_Height];
for (int i = 0 ; i<m_Width ; i++)
for(int j = 0 ; j< m_Height ; j++)
Color[j] = 0;
}

Теперь подключаю его к проекту следующим образом: В файл "stdafx.h" дописываю
#include "D:\MyVClib\BitPlane.h" (там файлик лежит)

И пытаюсь использовать написанный класс в в конструкторе диалогового класса
CMyDlg::CMyDlg(CWnd* pParent /*=NULL*/)
: CDialog(CMyDlg::IDD, pParent)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
CBitPlane* bp = new CBitPlane();
}

Получаю ошибку:
My error LNK2005: "public: __thiscall CBitPlane::CBitPlane(void)" (??0CBitPlane@@QAE@XZ) already defined in MyDlg.obj

Подскажите пожалуйста в чем проблема? Может я просто неправильно подключаю заголовочный файл?

Заранее спасибо!
461
23 апреля 2004 года
gerard
102 / / 20.12.1999
Цитата:
Originally posted by disorder
Здравствуйте!
Проблема такая:
Написал свой заголовочный файл "BitPlane.h", в нем определил класс
class CBitPlane
{
public:
int m_Width, m_Height; // ширина и высота битовой плоскости в пикселах
DWORD **Color ; // массив точек плоскости


CBitPlane();
~CBitPlane();
};

Теперь подключаю его к проекту следующим образом: В файл "stdafx.h" дописываю
#include "D:\MyVClib\BitPlane.h" (там файлик лежит)

И пытаюсь использовать написанный класс в в конструкторе диалогового класса
CMyDlg::CMyDlg(CWnd* pParent /*=NULL*/)
: CDialog(CMyDlg::IDD, pParent)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
CBitPlane* bp = new CBitPlane();
}

Получаю ошибку:
My error LNK2005: "public: __thiscall CBitPlane::CBitPlane(void)" (??0CBitPlane@@QAE@XZ) already defined in MyDlg.obj

Подскажите пожалуйста в чем проблема? Может я просто неправильно подключаю заголовочный файл?

Заранее спасибо!


Возможно, BitPlane.h у вас подключается более одного раза. Поставьте в его начало #pragma once.

4.8K
23 апреля 2004 года
disorder
17 / / 17.02.2004
Цитата:
Originally posted by gerard

Возможно, BitPlane.h у вас подключается более одного раза. Поставьте в его начало #pragma once.


#pragma once в начале есть. Я вот подумал что может нельзя размещать объявление класса и определение его методов в одном файле, а надо использовать BitPlane.cpp

Вообще я избавился от этой проблемы таким образом:
я в Linker/Command Line/Additional Options указал /FORCE:MULTIPLE

При этом все компилится нормально, но по-моему это не слишком грамотное решение.Если кто-нибудь знает как сделать по-другому, подскажите пожалуйста.

527
23 апреля 2004 года
pavor
275 / / 28.09.2003
Цитата:
Originally posted by disorder
Здравствуйте!
Проблема такая:
Написал свой заголовочный файл "BitPlane.h", в нем определил класс
class CBitPlane
{
public:
int m_Width, m_Height; // ширина и высота битовой плоскости в пикселах
DWORD **Color ; // массив точек плоскости


CBitPlane();
~CBitPlane();
};

конструктор

CBitPlane::CBitPlane()
{
m_Width = 640;
m_Height = 480;
Color = new DWORD*[m_Width];
for (int i = 0 ; i<m_Width ; i++)
Color = new DWORD[m_Height];
for (int i = 0 ; i<m_Width ; i++)
for(int j = 0 ; j< m_Height ; j++)
Color[j] = 0;
}

Теперь подключаю его к проекту следующим образом: В файл "stdafx.h" дописываю
#include "D:\MyVClib\BitPlane.h" (там файлик лежит)

И пытаюсь использовать написанный класс в в конструкторе диалогового класса
CMyDlg::CMyDlg(CWnd* pParent /*=NULL*/)
: CDialog(CMyDlg::IDD, pParent)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
CBitPlane* bp = new CBitPlane();
}

Получаю ошибку:
My error LNK2005: "public: __thiscall CBitPlane::CBitPlane(void)" (??0CBitPlane@@QAE@XZ) already defined in MyDlg.obj

Подскажите пожалуйста в чем проблема? Может я просто неправильно подключаю заголовочный файл?

Заранее спасибо!



Напиши inline или __forceinline

2.1K
23 апреля 2004 года
cozy
69 / / 11.01.2004
Ну а если подключить в CMyDlg.cpp?
На самом деле, все зависит от того как ты объявляешь объекты своего класса. ClassWizard может сам автоматически подключить хидер
3
23 апреля 2004 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by disorder

Я вот подумал что может нельзя размещать объявление класса и определение его методов в одном файле, а надо использовать BitPlane.cpp


Да, это верно!

4.8K
23 апреля 2004 года
disorder
17 / / 17.02.2004
Цитата:
Originally posted by Green

Да, это верно!



Я понимаю что вопрос совсем уж ламерский, но все-таки. А подскажите где какие инклуды писать надо?

Если в stdafx.h прописать:
#include "D:\MyVClib\BitPlane.cpp"
В BitPlane.cpp написать:
#include "BitPlane.h"
А в BitPlane.h:
#pragma once.

То получается та же самая ошибка.

3
23 апреля 2004 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by disorder


Я понимаю что вопрос совсем уж ламерский, но все-таки. А подскажите где какие инклуды писать надо?

Если в stdafx.h прописать:
#include "D:\MyVClib\BitPlane.cpp"
В BitPlane.cpp написать:
#include "BitPlane.h"
А в BitPlane.h:
#pragma once.

То получается та же самая ошибка.



в stdafx.h и BitPlane.cpp написать:
#include "BitPlane.h"
А в BitPlane.h:
#pragma once.

А такое никогда не писать:
#include "D:\MyVClib\BitPlane.cpp"

4.8K
24 апреля 2004 года
disorder
17 / / 17.02.2004
Цитата:
Originally posted by Green


в stdafx.h и BitPlane.cpp написать:
#include "BitPlane.h"
А в BitPlane.h:
#pragma once.

А такое никогда не писать:
#include "D:\MyVClib\BitPlane.cpp"



Я должен скопировать файлы в папку с проектом получается?
Я так пробовал, но при этом получается ошибка LNK2019 , т.е, насколько я понял, линкер не видит то что находится в BitPlane.cpp, что в принципе логично, т.к. в stdafx.h я включаю BitPlane.h, в который не включен BitPlane.cpp. Именно поэтому я и пытался включить в stdafx.h файл BitPlane.cpp, в котором есть ссылка на заголовочный файл.
Может быть недостаточно просто написать инклуды, а надо обязательно включать файлы в проект, хотя я пробовал, все-равно не выходит.

527
24 апреля 2004 года
pavor
275 / / 28.09.2003
Цитата:
Originally posted by disorder


Я должен скопировать файлы в папку с проектом получается?
Я так пробовал, но при этом получается ошибка LNK2019 , т.е, насколько я понял, линкер не видит то что находится в BitPlane.cpp, что в принципе логично, т.к. в stdafx.h я включаю BitPlane.h, в который не включен BitPlane.cpp. Именно поэтому я и пытался включить в stdafx.h файл BitPlane.cpp, в котором есть ссылка на заголовочный файл.
Может быть недостаточно просто написать инклуды, а надо обязательно включать файлы в проект, хотя я пробовал, все-равно не выходит.


Не тормози, я написал в чем проблема. Конструктор не объявлен инлайновым и поэтому Linker включая header в разные cpp считает что это два разных метода. То есть у тебя один и тот же метод объявляется два раза.
Если не подключать cpp к проекту, то не будет генерироваться объектный файл и нечего будет связывать.

3
24 апреля 2004 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by disorder

Я должен скопировать файлы в папку с проектом получается?


Не обязательно.

Цитата:
Originally posted by disorder

Может быть недостаточно просто написать инклуды, а надо обязательно включать файлы в проект, хотя я пробовал, все-равно не выходит.


Конечно, все файлы .cpp (.c) должны быть добавлены в проект, иначе они не будут компилироваться в объектные файлы.

А вообще-то, это все написано в любой книге по C++.

3
24 апреля 2004 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by pavor

Конструктор не объявлен инлайновым и поэтому Linker включая header в разные cpp считает что это два разных метода. То есть у тебя один и тот же метод объявляется два раза.



Линкер не включает заголовки "в разные cpp", это задача предкомпилятора.
Кроме того он не "считает что это два разных метода", а наоборот сообщает о том что конструктор уже определен.

А зачем в данном случае объявлять его inline?
Для того, чтобы несколько раз тащить один и тот же метод? Зачем?

4.8K
24 апреля 2004 года
disorder
17 / / 17.02.2004
Огромное всем спасибо! Я разобрался. Все работает без inline.
527
24 апреля 2004 года
pavor
275 / / 28.09.2003
Цитата:
Originally posted by Green


Линкер не включает заголовки "в разные cpp", это задача предкомпилятора.
Кроме того он не "считает что это два разных метода", а наоборот сообщает о том что конструктор уже определен.

А зачем в данном случае объявлять его inline?
Для того, чтобы несколько раз тащить один и тот же метод? Зачем?


Я имел ввиду, что это все равно, что объявлять в header глобальную функцию, не определенную inline. Тогда это будут два разных тела с одним и тем же именем: имена одинаковые, linker только это определяет. А если объявить inline, то все будет нормально, так как метод каждый раз встраивается в код, а не вызывается по имени.
В общем суть в том, что описание и определение класса в header подразумевает, что все методы inline, а которые не inline, те в cpp.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог