[VS;C++] Как настроить, чтобы классы были целиком в файле .cpp?

durka82

Просто в книгах по С++ есть примеры, когда весь код класса содержится в одном файле.
А VS генерит всегда два файла: .h и .cpp.
Можно ли это изменить.
А то как-то это ненаглядно.

kokoc88

Кажется, тебе скоро предложат прочитать книгу про Си++....

Codcod

+1

yolki

почитай лучше книжку про С++

durka82

То есть так не бывает вообще?
Наверное я слишком долго писал на java и воспоминания о С++ мутировали на этой почве

kokoc88

То есть так не бывает вообще?
classes.cpp:

class A
{
public:
void f { }
};

class B
{
int g { return 0; }
};

durka82

Ну а раз бывает - почему нельзя настроить VS так?
Как минимум тогда надо посылать читать книгу/доку по VS-у, а не по С++.
А так просмотрел несколько книжек - того, что именно обязательно надо использовать h-ник, не нашел - максимум - слово "обычно".
Зато нашел примеры типа этого - без h-ника.
Так что если кто может дать конкретную ссылку - было бы очень интересно просветиться.

tamusyav

Дык, тебе нужно, чтобы тебе твой собственный класс был в одном файле? Если да, то создаешь файл и пишешь в нем код класса, какие проблемы-то?

kokoc88

Как минимум тогда надо посылать читать книгу/доку по VS-у, а не по С++.
Можешь и по нему тоже почитать. Хотя я редко встречал людей, которые не могут создать класс руками без визарда. File->New->Visual C++->C++ File (.cpp)

Dasar

класс нормально описывать в одном файле только, если он не используется в других классах(файлах)

Marusetta

это очевидно... но человек-то спрашивает вполне конкретную вещь?
Так вот, переформулирую его вопрос:
---
можно ли так настроить VS, чтобы код класса не разделялся на файлы .h и .cpp, а писался только в .cpp
Если да, то как.
---
ключевое слово - VS

durka82

Это понятно, но хочется приобщиться к прелестям прогресса

durka82

Как создавать класс руками я знаю
А ответа на свой вопрос в msdn-е не нашел.
Если кто знает правильные ключевые слова - буду очень признателен

evgen5555

Ты, по ходу, вообще не в теме

evgen5555



А ответа на свой вопрос в msdn-е не нашел.
Правильно, потому что вопрос твой зиждется на абсолютном непонимании структуры языка.

durka82

То есть могут быть проблемы, если делать
#include "lib.cpp" 
?

durka82

Именно.
И если я правильно понял - ответ отрицательный.
То есть если мне такое надо - надо писать класс руками.
Правильно?

durka82

Так просвяти пожалуйста.
Можно ссылкой (но не абстрактной - типа прочитай книгу такую-то - как-будто я их не читал, а конкретной - типа в книге такой-то раздел такой-то (а лучше с точностью до страницы.
Спасибо.
А то в половине книжек есть примеры, опровергающие твое утверждение (то есть там все в одном файле).

kokoc88

То есть если мне такое надо - надо писать класс руками.
Да, если тебе надо написать класс в теле уже имеющегося .cpp файла, то надо руками (о, ужас!) в этот имеющийся .cpp файл написать:
class CMyClass
{
};
Компания Microsoft приносит свои извинения за такие неудобства и обещает добавить эту опцию в визард в следующем сервис паке MSVS 2005. Вместо того, чтобы просто открыть руками имеющийся .cpp файл и написать там пару строчек, можно будет открыть визард, указать там файл, в котором нужно создать класс, а затем имя класса.

Realist

Ответ примерно такой же, как на вопрос:
"У меня будут проблемы, если я программу на Java буду писать редактром MS Word в одну строчку?"

durka82


Да, если тебе надо написать класс в теле уже имеющегося .cpp файла, то надо руками (о, ужас!) в этот имеющийся .cpp файл написать:
class CMyClass
{
};

Похоже, что это ты не в теме.
Смотри, как бы после такого тебя самого не послали читать книги по С++.

Компания Microsoft приносит свои извинения за такие неудобства и обещает добавить эту опцию в визард в следующем сервис паке MSVS 2005.

И откуда столько эмоций?
Такое ощущение, что это тебе было поручено встроить в VS эту функциональность, но ты не справился.

durka82

А кроме неудобства, какие-нибудь проблемы будут?

Realist

+1 за то, что полновесные классы (которые используются нелокально) надо разделять на .cpp и .h. Визард создан для того, чтобы создавать такие вот классы. Если ты хочешь какой-то простой класс
создать, который в одном месте используется, пиши его руками в .cpp. Простые классы типа
  
class MyClass
{
public:
void set(int i_) {i=i_;}
int get {return i;}
private:
int i;
};

пишутся просто в .h файлы.
Примеры в книжке простые. Тебя же не смущяет, что в книжках пропускают всякие include, using, etc. Ну вот и всякое разделение на файлы тоже могут пропустить.

Realist

Да, будут.
Например,
 
//h.cpp
int i;
typedef char MyType;

//main.cpp
#include "h.cpp"

int main(int, char **)
{
MyType myvar;
return 0;
}

//2.cpp
#include "h.cpp"

MyType var2;


MyType используется в обоих main.cpp и 2.cpp, мы должны включить h.cpp в оба файла, но тогда определение int i; встретится дважды
link /nologo /OUT:main.exe main.obj 2.obj
2.obj : error LNK2005: "int i" (?@3HA) already defined in main.obj
main.exe : fatal error LNK1169: one or more multiply defined symbols found

evgen5555

Пиши всё в одном файле, в общем.

durka82

MyType используется в обоих main.cpp и 2.cpp, мы должны включить h.cpp в оба файла, но тогда определение int i; встретится дважды

А разве макросы типа IFDEF как раз не для этого нужны?
В них как правило все h-ники заворачиваются.
Или с cpp это не пройдет?

Olenenok

ньдя, может заботаешь-таки книжку "C++ для чайников"?

oleg701

IFDEF нужен для того, чтобы один и тот же .h файл не включился в одном файле дважды (это для вложенных .h).
А здесь речь о том, что у тебя в двух файлах проекта .h включился каждый раз единожды, но в итоге ты имеешь две глобальные переменные с одинаковым именем.
В случае, если это будет класс, ты будешь иметь две реализации одного и того же класса. Компилятор такого не простит.

kokoc88

Похоже, что это ты не в теме.
Смотри, как бы после такого тебя самого не послали читать книги по С++.
Да что ты? А ты, значит, автор boost:mpl?

durka82

Спасибо за совет, но я его не просил.
И вообще, когда пишут что-то вроде

Правильно, потому что вопрос твой зиждется на абсолютном непонимании структуры языка.
, обычно создается впечатление, что чел сам плохо понимает. что же это за такая "структура языка", но хочет показать, сколько умных слов он знает.

evgen5555

Могу подсказать ещё одно умное слово — "прототип". Оно, как мне видится, ключевое.

durka82

Прежде чем советы давать, не мешало бы почитать саму тему.
Я просил такие ссылки давать конкретные.
А то твой ответ похож на пустышку.

kokoc88

Прежде чем советы давать, не мешало бы почитать саму тему.
Я просил такие ссылки давать конкретные.
А то твой ответ похож на пустышку.
Тебе уже 10 раз объяснили, почему визард генерирует так, а не иначе. А так же зачем это надо. И почему никому не надо того, что ты просишь.

durka82

boost:mpl
Ты про это ?
Вот и дал бы ответ на вопрос сабжа, а не общие слова, еще и как минимум неполна

durka82

Мб теперь разъяснишь смысл?

durka82


Тебе уже 10 раз объяснили, почему визард генерирует так, а не иначе. А так же зачем это надо. И почему никому не надо того, что ты просишь.

Наконец-то я получил краткий и точный ответ на вопрос субжа.
До этого ответы как правило были неконкретны и/или не по теме (хотя среди них были и очень познавательные посты).

evgen5555

Чтобы код компилировался, для используемых объектов нужно определять прототипы. Списки прототипов обычно лежат в header-файлах (за этим они, собственно, и создаются дубликаты в определениях прототипов не критичны.

При связывании (линковке) использованный прототип резолвится в соответствующую функцию в одном из объектников/либ — должна существовать реализация, которую можно сделать отдельным файлом.

durka82

Всем спасибо за конструктивное обсуждение.
Сори за недоформулировку темы (хотя вот же понял, о чем я) - зато узнал больше, чем ожидал.

durka82

Наткнулся в VS2005 на галочку Inline, которая как раз и позволяет делать как в субже.
Вдруг кому пригодится.
Оставить комментарий
Имя или ник:
Комментарий: