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

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

Сообщение Anonymous »

Я использую struct, называемый Appcontext, внутри файла с именем зависимых. Он предварительно скомпилирован в заголовке Pch.H. Я использую Cmake, чтобы справиться со всеми моими занятиями, а что нет. Все работало, пока я не решил попытаться упростить зависимости, потому что меня раздражало, передавая все занятия по их ссылкам. Вот структура, которую я создал Bellow для хранения ссылок.#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;
};
< /code>
Вот моя основная функция, я начинаю контекст приложения с новым экземпляром из всех важных классов. Однако я не могу инициировать менеджер клиента или менеджера по акциям, потому что они оба используют DBManager, и один использует бизнес-менеджер, поэтому им нужно, чтобы AppContext прошел в этих ссылках, поэтому я не могу определить их, прежде чем сделать 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;

}

< /code>
Я получаю много неописуемых ошибок в отношении AppContext в классе Manager и классе Client Manager. Вот ошибки.'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 ';'
< /code>
См. Меню счета -фактуры, который является файлом, который вызывает основной класс. и акции/клиентский диспетчер.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;
};
< /code>
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;
};
< /code>
#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();
};

< /code>
Я попытался обратить внимание на вызовы классов и закончил там, где я сейчас нахожусь, почти уверен, что каждый класс получает необходимые им ссылки. Я также пытался использовать общие указатели для клиентов и менеджеров по акциям, безрезультатно. Там может быть какое -то отношение к занятиям, которыми я не поделился здесь, я не уверен, я застрял здесь в течение нескольких дней, все было хорошо, прежде чем я попытался облегчить свою жизнь. Пожалуйста, дайте мне знать, если я даже делаю что -то вроде приложения или чем вы, ребята, помогать себе в этом отношении.


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

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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