如何使用qt调用另一个cpp文件中的main.cpp中的实例化类--C++

问题描述:

我的modBusSHARED变量是一个变量,我将在某些类中使用.cpp。如何使用qt调用另一个cpp文件中的main.cpp中的实例化类--C++

何随时从main.cpp调用它们,而不需要重新实例吗? 也许我需要一个单身?在qt中有一种方法,我从main调用class而不用构建singleton?

我正在使用Qt 5.9。

int main(int argc, char *argv[]) { 
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling); 
    QGuiApplication app(argc, argv); 

    QQmlApplicationEngine engine; 

    ModbusMasterMobile modBusSHARED; 
    bool test = modBusSHARED.connectWIFITCP("xxx.xxxx.xxxx.xxxx", 1234, 3000); 

    engine.load(QUrl(QLatin1String("qrc:/main.qml"))); 
    if (engine.rootObjects().isEmpty()) 
     return -1; 

    return app.exec(); 
} 
+0

你试过传递变量要么你的类的构造函数或类的方法呢? –

+0

是的,但通过变量它不是我的目标...我的目标是调用类,当我想从CP ...也许独特的解决方案是单身。 –

+0

假设你的班级是Car,而Car需要一个Driver(来自'main')。您在'Car'中创建一个成员,该成员是对'Driver'的引用。 'Car'构造函数将有一个'Driver'参数作为参数。 –

您可以使用您的static ModbusMasterMobile * modbus;其他类被创建后它尽快初始化为&modBusSHARED

然后,您将有权从其他类的所有实例访问该对象。

拥有一个单例是为了防止意外创建多次该类型的实例。但是你的情况并不适合单身人士,你所需要做的只是不创建更多的对象实例。一旦你初始化了静态指针,它就会指向那个实例。

// in Class.h 
class Class { 
    public: 
    static ModbusMasterMobile * modbus; // now you can use modbus inside Class 
    // ... other stuff 
}; 

// in Class.cpp 
ModbusMasterMobile * Class::modbus = 0; 

// in main.cpp 
ModbusMasterMobile modBusSHARED; 
Class::modbus = &modbus; // initialize it 
// from this point on Class can use modbus 

只要确保Class不使用modbus之前在main.cpp被初始化。

这个

我的例子

static QMutex mainMutex; 
... 
MainController* MainController::s_instance = NULL; 
... 
MainController* MainController::getInstance() 
{ 
    if(!s_instance){ 
     QMutexLocker lock(&mainMutex); 
     if(!s_instance){ 
      s_instance = new MainController; 
     } 
    } 
    return s_instance; 
} 

int MainController::exec(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 
    initializeControllers(); 
    initializeSplashScreen(); 
    initializeLoginScreen(); 
    startCommunicationToServer(); 
    return a.exec(); 
} 
int main(int argc, char *argv[]) 
{ 
    return MainController::getInstance()->exec(argc,argv); 
}