Камрады, столкнулся с такой проблемой. Делаю класс для отладки по сериал. Возникла путаница с #include. Помогите разобраться. Схема проекта следующая. Shop.h Код (C++): #ifndef SHOP_H #define SHOP_H #include <debugger.h> #include <product.h> class Shop { public: private: Product _prod; }; #endif product.h Код (C++): #ifndef PRODUCT_H #define PRODUCT_H #include <debugger.h> class Product { public: int type = 1; private: }; #endif product.cpp Код (C++): #include <product.h> debugger.h Код (C++): #ifndef DEBUGGER_H #define DEBUGGER_H #include <shop.h> class Debugger { public: bool var = false; private: }; #endif При компиляции выдает ошибку: error: 'Product' does not name a type Если я в файле product.h убираю #include <debugger.h>, то всё гуд. И так вертел, и эдак - не пойму почему так((
класс debugger будет синглтоном. Мне нужно, чтобы я из любого места программы мог его вызвать. Всё работало, пока не решил сделать еще красивше и не включить некоторые классы в сам класс debugger. На примере выше - это класс Shop. И тут пошло, поехало. Из кода убрал всё лишнее. Осталась только та часть, которая вызывает ошибку
да, кстати, если из файла product.cpp убрать #include <product.h>, тоже всё гуд. Такое ощущение, что я не до конца правильно понял концепцию include и где-то жестко туплю((
в том то и дело - он мне там нужен. Я хочу создать объект класса shop в дебаггере и использовать данные этого объекта. Причем мне нужно и создать объект класса product в дебаггере и его тоже использовать
Идея такая: в debugger.h создаю указатели на объекты классов shop и product. В файле main.cpp, при создании объектов классов shop и product, я передаю указатели на эти объекты в debugger.h. В debugger.h создаю функцию, например printShopData(). В main.cpp вызываю printShopData(). И спокойно в debugger.h внутри printShopData() вывожу нужные мне данные, чтобы код файла main.cpp был менее загружен и более читабелен.
Если я уберу #include <debugger.h> из shop.h, то не смогу вызвать методы дебаггера из этого файла - он их не увидит
А в чём это всё собирается? Файлы product.h и product.cpp должны быть включены в проект, иначе они не будут связаны между собой.
у меня все работало. В отладчике я выводил уже готовые данные, которые ему передавались из других файлов. Но проект разросся и теперь я хочу подготавливать данные уже внутри дебаггера (там и прием команд по Serial, и назначение переменных данными принятыми из Serial, и просто вывод данных)
main.cpp Код (C++): #include "debugger.h" #include <shop.h> Shop _shop; void setup() { Debugger::getDebugger()._shop = &_shop; Debugger::getDebugger()._product = &_shop._prod; } void loop() { // хочу проверить отладчиком данные Debugger::getDebugger().printShopData(); } shop.h Код (C++): #ifndef SHOP_H #define SHOP_H // включил т.к. мне понадобится и здесь использовать отладчик // также как в product.h. Не стал расписывать , чтобы не загромождать код // принцип такой же как и в product.h и product.cpp #include <debugger.h> #include <product.h> class Shop { public: Product _prod; private: }; #endif product.h Код (C++): #ifndef PRODUCT_H #define PRODUCT_H #include <debugger.h> class Product { public: void calculate(); private: }; #endif product.cpp Код (C++): #include <product.h> void Product::calculate() { // какие то вычисления // хочу их проверить отладчиком Debugger::getDebugger().printProductData(); } debugger.h Код (C++): #ifndef DEBUGGER_H #define DEBUGGER_H #include <shop.h> #include <product.h> class Debugger { public: Shop *_shop; Product *_product; void printShopData(); void printProductData(); //************************************************************* // подготовка класса как singletone Debugger(const Debugger &) = delete; // нужно чтобы объект класса был точно единственным void operator=(const Debugger &) = delete; // нужно чтобы объект класса был точно единственным static Debugger &getDebugger() { static Debugger dbg; return dbg; } //************************************************************* private: // Конструктор должен быть private для singletone Debugger() {} }; #endif
Это связано с защитой от редекларации #ifndef PRODUCT_H. Класс Product задекларировался и больше не виден компилятору. Меняйте структуру файлов на что-то более логичное.
В такой последовательности объявления объектов, код не будет собираться, даже если поместить всё в один файл. Вначале попробуйте запустить всё в одном файле, а потом уже пробуйте разделять.