заголовок — Проблемы структуры C ++

Итак, я разработчик Java, который пытается изучать C ++. Многофайловая структура C ++ для меня странна, так как я являюсь Java-разработчиком, избалованным классами.

Я пытаюсь создать файл .cpp, который может загружать другие файлы .cpp аналогично Java-классу, загружая другие классы. Насколько я понимаю, у меня есть 3 файла: main.cpp, filetobeloaded.h и filetobeloaded.cpp, которые находятся в одном каталоге. main.cpp будет иметь

#include <filetobeloaded.h>

и тогда filetobeloaded.h будет иметь

#ifndef LOOP_H
#define LOOP_H

void loop_start();
void loop_run();
void loop_init();

#endif  /* LOOP_H */

пока файлtobeloaded.cpp будет иметь

void loop_init(){
//load libraries here
}

void loop_start(){
//this loop runs as long as the user doesn't request the program to close.
//In that case, this function will return and the program will exit.
}

void loop_run(){
//render stuff here, call subroutines
}

Очевидно, я делаю что-то не так, потому что мой компилятор говорит мне, что строка

#include <filetobeloaded.h>

неверно, потому что файл не существует. Я проверил, и filetobeloaded.h и filetobeloaded.cpp находятся в одном каталоге с main.cpp. Я понятия не имею, почему это портит.

Вопросы:

1: Почему у меня возникают ошибки и как их исправить?

2: есть ли лучший способ разделить мой исходный код на разные файлы, чем то, что я делаю?

3: Можете ли вы объяснить многофайловую структуру C ++ таким образом, чтобы Java-разработчик понял это?

Я пытаюсь сделать игру на C ++ с OGL. Я изучаю c ++ против java из-за скорости, меньших утечек памяти (я надеюсь) и интеграции из steam.

У меня нет хорошей книги по c ++, и я искал по всему интернету … Кажется, у всех есть разные способы сделать это, и это меня очень смущает …

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

2

Решение

  1. дела #include <...> поиск в каталогах include (специфичных для компилятора, обычно /usr/include и кучу других для Linux, или каталог установки компилятора в Windows), в то время как #include "..." ищет в текущем каталоге. Убедитесь, что вы используете правильный.

  2. Нет, вы делаете это правильно.

  3. В C ++ есть объявления1 и определения2. Объявления могут находиться где угодно, и в одном модуле перевода может быть столько объявлений с тем же именем, сколько вы хотите, но (неinlineопределения, не связанные с шаблонами, не связанные с внутренними связями, могут быть не более одного .cpp файл (технически называется «модуль компиляции» или «модуль перевода»), иначе вы получите ошибку «множественного определения» во время компоновки. Также стоит отметить, что определение также служит декларацией, но не наоборот.

    В C ++ нельзя использовать имя (функцию, структуру, переменную и т. Д.) До того, как оно объявленный, как вы можете в Java, но вы можете использовать его, прежде чем он определенный в большинстве случаев, просто написав декларацию выше точки использования.

    Заголовочные файлы предназначены для размещения объявлений (и inline определения функций и определения шаблонов) во всех нужных им файлах без необходимости копировать и вставлять их снова и снова в каждый файл .cpp. На самом деле вы можете написать C ++ без использования заголовочных файлов, но это будет очень утомительно, и будет много дублирования кода.

1 Примеры объявлений, которые не являются определениями:

extern bool bar;
class c;
int foo();
int foo();
int foo(); // Can have many declarations of the same name as long as they match

2 Примеры определений (которые также являются декларациями):

bool bar;
bool baz = false;
class c { int m; };
int foo() { return 45; }
int foo() { return 45; } // Error: multiple definition
8

Другие решения

Должно быть …

#include "filetobeloaded.h"

Когда вы включаете файлы из текущего каталога, вам нужно поместить их в кавычки, а не в имеющиеся у вас угловые скобки.

#include <filetobeloaded.h> //only looks in the systems directory
3

В C ++ у вас есть две формы include

#include <somefile.h>

а также

#include "somefile.h"

Первый просматривает только системные каталоги, а второй — и текущий.

3

В дополнение к другим ответам, вам нужно будет иметь include также в файле .cpp.

Кроме того, у меня лично были бы методы в классе вместо глобального класса. В C ++ есть функция, позволяющая иметь методы (и другие вещи), доступные глобально, а не в классе.

РЕДАКТИРОВАТЬ: так как функции не находятся в классе и определены глобально, вам не нужно include линия.

1

Смотрите также, https://stackoverflow.com/questions/21593/

Этот вопрос можно считать дубликатом, но он сформулирован иначе, чем связанный ответ. По сути, стандарт C не определяет строго, в чем разница, и вы должны обратиться к документации для вашего компилятора для окончательного ответа.

0
По вопросам рекламы [email protected]