Я пытаюсь упростить свои зависимости, используя структуру для хранения и объявления ссылок на мои классы, но получаю неоC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Я пытаюсь упростить свои зависимости, используя структуру для хранения и объявления ссылок на мои классы, но получаю нео

Сообщение Anonymous »

Я использую структуру под названием AppContext внутри файла с именем зависимости. Он предварительно скомпилирован в заголовке pch.h. Я использую CMake для обработки всех своих классов и прочего.
Все работало, пока я не решил попытаться упростить зависимости, потому что меня раздражало передавать все классы через их ссылки. Вот структура, которую я создал для хранения ссылок:

Код: Выделить всё

#pragma once

#include "pch.h"
#include "Accounts/UserBusiness/BusinessManager.h"
#include "Accounts/UserBusiness/Clients/ClientManager.h"
#include "Stock/StockManager.h"
//#include "InvoiceSystem/InvoiceData/InvoiceManager.h"
struct AppContext {
AccountManager& accountMgr;
BusinessManager& businessMgr;
MongoDBDataManager& dbMgr;
//ClientManager& cliManager;
//StockManager& stkMgr;
//InvoiceManager& invoiceMgr;
};
Вот моя основная функция: я инициирую контекст приложения с помощью нового экземпляра всех важных классов. Однако я не могу запустить менеджер клиентов или менеджер запасов, потому что они оба используют DBmanager, а один использует бизнес-менеджер, поэтому им нужен контекст приложения для передачи этих ссылок, поэтому я не могу определить их перед созданием AppContext.

Код: Выделить всё

int main() {

/*Main Executable*/

/*Invoice Menu*/
AccountManager accountManager;
BusinessManager businessManager;
MongoDBDataManager dbManager;

auto user = std::make_shared("test@email.com", "password123");
user->setMongoUserID("USR00000001");
accountManager.setTestUser(user);
businessManager.setBusinessGlobally("BUS00000001");

// Create context
AppContext ctx{ accountManager, businessManager, dbManager, /*cliManager, stkManager*/ };
ClientManager cliManager(ctx);
StockManager stkManager(ctx);
BusinessMenu businessMenu(ctx);
InvoiceMenu invoiceMenu(ctx, stkManager, cliManager);
invoiceMenu.setTestUser(user);
invoiceMenu.displayInvoiceMenu();

return 0;
}
Я получаю много неописуемых ошибок, касающихся контекста приложения в классе менеджера запасов и классе менеджера клиентов. Вот ошибки.

Код: Выделить всё

'appCtx': undeclared identifier
'appCtx': undeclared identifier
'appCtx': undeclared identifier
'appCtx': undeclared identifier
'appCtx': undeclared identifier
'ClientManager': illegal member initialization: 'appCtx' is not a base or member
'ClientManager::dbManager': a reference type cannot be value-initialized
'StockManager': illegal member initialization: 'appCtx' is not a base or member
'StockManager::businessManager': a reference type cannot be value-initialized
'StockManager::dbManager': a reference type cannot be value-initialized
syntax error: identifier 'AppContext'
syntax error: identifier 'AppContext'
syntax error: missing ';' before '&'
syntax error: missing ';' before '&'
The member function can be made const.
unexpected token(s) preceding ';'
unexpected token(s) preceding ';'
Пожалуйста, посмотрите меню счета, которое представляет собой файл, который вызывает основной класс. и менеджер по запасам/клиентам.

Код: Выделить всё

class InvoiceMenu {
public:
InvoiceMenu(AppContext& appCtx, StockManager& stkMgr, ClientManager& cliManager) : appCtx(appCtx), invoiceDetails(appCtx),
cliManager(cliManager), stkMgr(stkMgr){}

void setTestUser(std::shared_ptr user) {
testUser = user;
}
void displayInvoiceMenu();

private:
AppContext& appCtx;
StockManager& stkMgr;
void createInvoice();
std::shared_ptr currentUser;
std::map businessMap;
InvoicePdfGenerator generator;
std::shared_ptr testUser;
InvoiceDetails invoiceDetails;
ClientManager& cliManager;
};

Код: Выделить всё

class StockManager {
public:
StockManager(AppContext& appCtx) : appCtx(appCtx) ,
dbManager(appCtx.dbMgr), businessManager(appCtx.businessMgr) {}
void displayAllStock();
std::optional stockMap();
std::optional createSearchMap();
std::unordered_map stkMap;

static void setStockItem(const std::string& stkID);
static std::shared_ptr getCurrentStockItem();

private:
AppContext& appCtx;
BusinessManager& businessManager;
MongoDBDataManager& dbManager;
static std::shared_ptr currentItem;
};

Код: Выделить всё

#pragma once
#include "../BusinessManager.h"
#include "pch.h"

#include "Client.h"

class ClientManager {
private:
static std::shared_ptr currentClient;
MongoDBDataManager& dbManager;
AppContext& appCtx;
public:
ClientManager(AppContext& appCtx) : appCtx(appCtx), dbManager(appCtx.dbMgr) {} // this is breaking due to appctx db is not working

static void setClient(std::shared_ptr client);
static std::shared_ptr getCurClient();
static void clear();

static std::unordered_map fetchBizClients();

bool chooseAClient();
};
Я попробовал отследить вызовы классов и в итоге оказался там, где нахожусь сейчас, будучи почти уверен, что каждый класс получает необходимые ему ссылки. Я также пытался использовать общие указатели для клиента и менеджеров по запасам, но безрезультатно.
Может быть что-то связано с классами, которыми я здесь не поделился, я не уверен, все было хорошо, пока я не попытался облегчить себе жизнь. Должен ли я использовать что-то вроде контекста приложения?

Подробнее здесь: https://stackoverflow.com/questions/796 ... nd-declare
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»