2016-08-19 10 views
2

정적 클래스가 있고 정적 인 QSettings이 있어야합니다. 하지만 내 초기화와 나는 경고 얻을 :먼저 QApplication 개체를 인스턴스화하십시오.

QSettings* MySQLConnection::settings = new QSettings(QApplication::applicationDirPath() + "/config.ini", QSettings::IniFormat); 

QCoreApplication :: applicationDirPath : 인스턴스화하십시오의 QApplication 내 주요의 시작 부분에 수동으로 QSetting를 초기화 해결 방법으로 첫째

객체를 기능. 정적 멤버를 초기화하는 더 좋은 방법이 있습니까?

감사합니다.

답변

7

이상적으로 모든 종류의 정적 클래스 인스턴스가 없어야합니다. 싱글 톤은 main()에 로컬 인스턴스가 있어야하며 정적 메서드는 인스턴스 포인터를 통해 일반 메서드로 전달해야합니다. 좋은 예를 들어 QCoraApplication이 어떻게 수행되는지보십시오.

어쨌든 QSettings 인스턴스는 임시 일 수 있습니다. 설정 메커니즘에 대한 핸들 일뿐입니다. 그것을 정체 시키거나 주변에 두는 것이별로 중요하지 않습니다. 함수에서 로컬 변수로 QSettings을 갖는 것은 정상입니다.

+0

고마워요! 나는 이제 싱글 톤을 올바른 방법으로 구현했으면 좋겠다. 적어도 디자인 패턴의 적절한 구현에 대해 배운 이후로 조금 시간이 걸렸다. 두 번째 사항 : 개인 회원으로 클래스 당 하나의 인스턴스 만 만드는 대신 QSettings의 로컬 인스턴스를 만들 때마다 이점은 무엇입니까? – honiahaka10

+0

다르게 설명하겠습니다. 다른 방법으로는 이점이 없습니다. 'QSettings'은 설정 시스템에 대한 핸들입니다. 어쨌든 아주 드물게 사용하고 있습니다. –

+0

@ honiahaka10 어떻게 그 싱글 톤을 구현했는지 자세히 설명해 주시겠습니까? – agbb

1

QApplicationQCoreApplication에서 파생됩니다. 당신이 sources에서 볼 수 있듯이
, applicationDirPath는 다음과 같이 정의된다 : 코드에 더 깊은 것까지

QString QCoreApplication::applicationDirPath() 
{ 
    if (!self) { 
     qWarning("QCoreApplication::applicationDirPath: Please instantiate the QApplication object first"); 
     return QString(); 
    } 

    // ... more code 
} 

, 우리는 self에서, init 기능에 의해 초기화되는이 생성자에 의해 호출되는 것을 찾을 수 있습니다.
Q*Application 클래스 (이 경우 인스턴스는 QApplication)의 인스턴스를 명시 적으로 만들지 않으면 예상대로 작동하지 않습니다. 문서에서

참고 가능한 한 빨리 이러한 클래스를 생성하는 것이 좋습니다 그 위에 : 일반적으로

, 우리는() 당신이 QCoreApplication, QGuiApplication 또는 주에서의 QApplication 객체를 생성하는 것이 좋습니다 가능한 한 일찍 기능한다. exec()는 이벤트 루프가 종료 될 때까지 리턴하지 않습니다. 예를 들어, quit()가 호출 될 때.

물론 QApplication::applicationDirPath()에 액세스하기 전에 의미합니다.
그렇지 않으면 QSettings을 사용하는 동안 해당 방법에서 올바른 경로를 가져올 수 없습니다.

+0

Tahnk you! 나는 이미이 문제를 해결하는 방법을 묻는 이유에 대해 이미 읽었습니다.Kuba Ober가 언급 한대로 signleton을 사용하여이를 해결했습니다. – honiahaka10