Russian Qt Forum

Программирование => С/C++ => Тема начата: catprog от Июль 03, 2009, 12:03



Название: Вопрос по include
Отправлено: catprog от Июль 03, 2009, 12:03
Есть "начальные"(GUI) mainwindow.h и mainwindow.cpp
И пусть есть класс MyControler описаный в файлах: mycontroler.h и mycontroler.cpp
Про файл:
Код:
QT += network
TARGET = my_http
TEMPLATE = app
SOURCES += main.cpp \
    mainwindow.cpp \
    mycontroler.cpp
HEADERS += mainwindow.h \
    mycontroler.h
FORMS += mainwindow.ui

Как правильно надо писать, где и что, чтобы в файлах mainwindow.h и mainwindow.cpp можно было пользовать этот класс?

Если я пишу например в файле mainwindow.h
class MyControler;
то это помогает только для файла mainwindow.h, хотя должно бы помочь и для mainwindow.cpp так как там есть строка include "mainwindow.h"  ???
А если такую строку написать в обоих файлах говорит что два раза так писать нельзя ???


Название: Re: Вопрос по include
Отправлено: Авварон от Июль 03, 2009, 12:11
напиши include "mycontroler.h" только в хедере


Название: Re: Вопрос по include
Отправлено: catprog от Июль 03, 2009, 12:44
напиши include "mycontroler.h" только в хедере
Спасибо. Работает. А как понять почему оно работает именно так, может можно гдето почитать доходчивую статью?


Название: Re: Вопрос по include
Отправлено: lit-uriy от Июль 03, 2009, 12:49
Запись:
class MyControler;
Годится только для сообщения компилятору о том, что где-то(!) есть такая "штука".
Но чтобы этой "штукой" воспользоваться нужно её заголовочник с полным описанием.
Если ты объявляешь переменную (не указатель) типа MyControler, или используешь члены этого класса понадобится полное описание.

Часто делают так, в mainwindow.h:
class MyControler;

в mainwindow.cpp:
#include "mycontroler.h"

Тогда в заголовочнике не будет лишнего, а mainwindow.cpp будет включено полное описание


Название: Re: Вопрос по include
Отправлено: Авварон от Июль 03, 2009, 12:49
это описание языка си. директива #incude просто включает текст указанного файла. надпись class A; говорит что далее будет объявлен класс А, но при описании этой строки про класс ничего не известно (инфа-то в хедере). По сему ты можешь объявлять только указатели на него.
Если ты включаешь #incude "a.h" в b.h и b.cpp, то он у тебя вставит текст 2 раза (1 раз из b.h и 2й из b.cpp). Способ этого избежать - закдючать текст хедера в "скобки"
Код:
#ifndef __A
 #define __A
 тут твой класс
 #endif


Название: Re: Вопрос по include
Отправлено: catprog от Июль 03, 2009, 13:36
Благодарю, теперь более мене ясно.
Если я правильно понял то если у меня в проекте будет файл mycontroler.h, то если по коду не будет #include "mycontroler.h" этот файл даже не откомпилиться.
И второе что понял - файлы *.cpp нигде не надо инклудить, они сами както инклудятся беспорядочным образом.


Название: Re: Вопрос по include
Отправлено: Авварон от Июль 03, 2009, 13:38
в мейк файле есть строка g++ -c file1.cpp -o file1.o на каждый файл .cpp (грубо говоря). И есть строка g++ file1.o ... fileN.o -o твоя_программа.exe


Название: Re: Вопрос по include
Отправлено: Alex Custov от Июль 03, 2009, 23:33
И второе что понял - файлы *.cpp нигде не надо инклудить, они сами както инклудятся беспорядочным образом.

Может стоит затариться литературой?  ;)