Подключение своих заголовочных файлов к проекту
Проблема такая:
Написал свой заголовочный файл "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
Подскажите пожалуйста в чем проблема? Может я просто неправильно подключаю заголовочный файл?
Заранее спасибо!
Здравствуйте!
Проблема такая:
Написал свой заголовочный файл "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.
Возможно, BitPlane.h у вас подключается более одного раза. Поставьте в его начало #pragma once.
#pragma once в начале есть. Я вот подумал что может нельзя размещать объявление класса и определение его методов в одном файле, а надо использовать BitPlane.cpp
Вообще я избавился от этой проблемы таким образом:
я в Linker/Command Line/Additional Options указал /FORCE:MULTIPLE
При этом все компилится нормально, но по-моему это не слишком грамотное решение.Если кто-нибудь знает как сделать по-другому, подскажите пожалуйста.
Здравствуйте!
Проблема такая:
Написал свой заголовочный файл "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
На самом деле, все зависит от того как ты объявляешь объекты своего класса. ClassWizard может сам автоматически подключить хидер
Я вот подумал что может нельзя размещать объявление класса и определение его методов в одном файле, а надо использовать BitPlane.cpp
Да, это верно!
Да, это верно!
Я понимаю что вопрос совсем уж ламерский, но все-таки. А подскажите где какие инклуды писать надо?
Если в stdafx.h прописать:
#include "D:\MyVClib\BitPlane.cpp"
В BitPlane.cpp написать:
#include "BitPlane.h"
А в BitPlane.h:
#pragma once.
То получается та же самая ошибка.
Я понимаю что вопрос совсем уж ламерский, но все-таки. А подскажите где какие инклуды писать надо?
Если в 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"
в 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, в котором есть ссылка на заголовочный файл.
Может быть недостаточно просто написать инклуды, а надо обязательно включать файлы в проект, хотя я пробовал, все-равно не выходит.
Я должен скопировать файлы в папку с проектом получается?
Я так пробовал, но при этом получается ошибка LNK2019 , т.е, насколько я понял, линкер не видит то что находится в BitPlane.cpp, что в принципе логично, т.к. в stdafx.h я включаю BitPlane.h, в который не включен BitPlane.cpp. Именно поэтому я и пытался включить в stdafx.h файл BitPlane.cpp, в котором есть ссылка на заголовочный файл.
Может быть недостаточно просто написать инклуды, а надо обязательно включать файлы в проект, хотя я пробовал, все-равно не выходит.
Не тормози, я написал в чем проблема. Конструктор не объявлен инлайновым и поэтому Linker включая header в разные cpp считает что это два разных метода. То есть у тебя один и тот же метод объявляется два раза.
Если не подключать cpp к проекту, то не будет генерироваться объектный файл и нечего будет связывать.
Я должен скопировать файлы в папку с проектом получается?
Не обязательно.
Может быть недостаточно просто написать инклуды, а надо обязательно включать файлы в проект, хотя я пробовал, все-равно не выходит.
Конечно, все файлы .cpp (.c) должны быть добавлены в проект, иначе они не будут компилироваться в объектные файлы.
А вообще-то, это все написано в любой книге по C++.
Конструктор не объявлен инлайновым и поэтому Linker включая header в разные cpp считает что это два разных метода. То есть у тебя один и тот же метод объявляется два раза.
Линкер не включает заголовки "в разные cpp", это задача предкомпилятора.
Кроме того он не "считает что это два разных метода", а наоборот сообщает о том что конструктор уже определен.
А зачем в данном случае объявлять его inline?
Для того, чтобы несколько раз тащить один и тот же метод? Зачем?
Линкер не включает заголовки "в разные cpp", это задача предкомпилятора.
Кроме того он не "считает что это два разных метода", а наоборот сообщает о том что конструктор уже определен.
А зачем в данном случае объявлять его inline?
Для того, чтобы несколько раз тащить один и тот же метод? Зачем?
Я имел ввиду, что это все равно, что объявлять в header глобальную функцию, не определенную inline. Тогда это будут два разных тела с одним и тем же именем: имена одинаковые, linker только это определяет. А если объявить inline, то все будет нормально, так как метод каждый раз встраивается в код, а не вызывается по имени.
В общем суть в том, что описание и определение класса в header подразумевает, что все методы inline, а которые не inline, те в cpp.