用慣C#再用C++的一些麻煩事


C#作為一種高級語言更接近於人的思維,而C++則更理解機器一些。就連平常用慣了的string類型,到了C++里變成了char*,wchar*等等原始的東東。由於平常只用QT這個類似C#對象系統的工具開發程序,主要奉行qt+winapi=一切,其他地都靠邊站別阻擋我視線的原則,所以很少接觸到純粹c++的東西,下面把我認為是麻煩事,而C++高手們卻視為家常便飯的知識點記錄備忘。

1、常量字符串 :

    主要是調用WinAPI函數時,有時需要const char*,有時需要const wchar*。

const char* str="this is a string",
const wchar* wstr=L"this is a wide string"//沒錯加個L就搞定

  如果你用的IDE和我一樣是QTCreator的話,你會發現:L"中文"時,會出現編譯錯誤--“Illegal byte sequence”。我用的2.2.1版本沒發現好的解決方法,只能用笨拙的方法,找到包含中文的.cpp或.h文件--〉用Notepad打開--〉另存為utf-8,就可以正確編譯了。

  如果是QString變量而不是常量,加“L”就不靈了。這時需要強制類型轉換:

 

const wchar_t *wstr = reinterpret_cast<const wchar_t *>(stitle.utf16());

2、對象為空的判斷:

 

//mainwindow.h中定義的對話框窗體
Dialog* dlg;

//mainwindow.cpp中判斷為空,則創建。
if(!dlg){
    dlg=new Dialog();
}
dlg.show();

本來以為這樣就行了,結果出錯!原因是:dlg指針沒有顯式初始化為0。

 

MainWindow::MainWindow():dlgset(0)

 

3、窗體設計:

a.Dock.Fill Qt中類似winforms的Dock概念是Layout布局 ,QT Creator中隱藏的好深:

 

 

 4、輸出調試信息:

 

#include <QDebug>

 

 

qDebug() << "test";

 

 程序運行時,在“應用程序輸出”中可以看到輸出信息。

 

 5、對象的銷毀:

C++沒有垃圾回收,QT使用引用計數來管理對象的是否可以釋放。通過delete釋放和銷毀對象:

 

 

 delete dlgset; //銷毀掉引用DataBase的對象

 QSqlDatabase::removeDatabase("qt_sql_default_connection");

//這里就不會有下面的警告了!
QSqlDatabasePrivate::removeDatabase: connection 'qt_sql_default_connection' is still in use, all queries will cease to work.); 

 

 

6、如果使用了windows的gdi等dll,需要添加對.lib的引用,才能被正確的連接,不然會有這樣的連接錯誤:

 

undefined reference to `CreatePen@12

解決方法: 在.pro工程文件中加入下面一行

LIBS += -lgdi32

 

特別推薦Qt開發的windows小程序實例源代碼:

 

生成的程序全部打包只有4M多,用戶解壓后可以直接運行。
 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM