2016-10-12 196 views
-1

好日子所有類型要求:傳遞字符串作爲參數傳遞給函數

注:我在C++一個初學者,自學我走,還道歉,如果這是一個重複的,但我還沒有找到一個例如/答案/教程來回答問題,可能我只是不明白它。

我有一個標頭和實現的函數,定義如下:

#ifndef RETURNOBJECT_H 
#define RETURNOBJECT_H 

#include <QtCore> 
#include "enums.h" 

class ReturnObject 
{ 
public: 
    ReturnObject(); 
    ReturnObject(ReturnCode enum_code, const char data); 

    const char getData(); 
    ReturnCode getCode(); 

private: 
    ReturnCode e_code; 
    const char data_string; 

}; 

#endif // RETURNOBJECT_H 

實施

#include "returnobject.h" 

ReturnObject::ReturnObject(){ 
    data_string="WARN"; 
} 

ReturnObject::ReturnObject(ReturnCode enum_code, const char data) 
    : e_code(enum_code) 
    , data_string(data) 
{} 

ResultCode ReturnCode::getCode() 
{ 
    return e_code; 
} 

const char ReturnObject::getData() 
{ 
    return data_string; 
} 

請注意,我不熟悉像我一樣,指針等應該是,但我對每個概念都有一個公正的理解。

目的:

該目的是通過一個自定義類函數創建,存儲在類中,並返回到父類。該對象包含一個自定義的exec()返回值和可能的輸出來自該類的輸出消息/數據(由於受限制的限制,例如QDialog.setResult()只允許exec()返回1或0的結果,我創建了這個)。

版本/問題/疑問

調用類:

Private 
    ReturnObject _ReturnObject; 

_ReturnObject = new ReturnObject(ReturnCode::LoginDialog_EmptyLoginPass, ""); 

提供下列錯誤:

/home/cx/qt-projects/project-i/loginstatusdialog.cpp:21: error: invalid conversion from 'const char*' to 'char' [-fpermissive] 
     _ReturnObject = new ReturnObject(ReturnCode::LoginDialog_EmptyLoginPass, ""); 
                        ^

因此,我從錯誤的結論是第二個參數 - >""data是問題,因爲我最有可能不正確地在構造函數中罰這個數據類型。

我應該如何在構造函數中定義這個?,而不是""使用哪種數據類型?據我所知,它具有const屬性。

我曾嘗試:

我一直在使用charconst charQString兩者給出一個類似的錯誤嘗試。

有什麼建議嗎?

編譯器輸出

const char * data

../project-i/loginstatusdialog.cpp: In constructor 'LoginStatusDialog::LoginStatusDialog(QString, QString, QString*, QWidget*)': 
../project-i/loginstatusdialog.cpp:21:44: error: use of deleted function 'ReturnObject& ReturnObject::operator=(ReturnObject&&)' 
     _Return_Object = ReturnObject(1, ""); 
              ^
In file included from ../project-i/loginstatusdialog.h:10:0, 
       from ../project-i/loginstatusdialog.cpp:1: 
../project-i/returnobject.h:7:7: note: 'ReturnObject& ReturnObject::operator=(ReturnObject&&)' is implicitly deleted because the default definition would be ill-formed: 
class ReturnObject 
     ^~~~~~~~~~~~ 
+1

仔細閱讀你的構造函數定義,你有一個錯字。 –

+2

另外'_ReturnObject'是實現保留標識符,不要使用它。 –

+0

@BaummitAugen我很抱歉,我沒有關注。你是否可能提及可能性,我忘記將'*'添加到'const char * data'中,如果是,那麼我沒有忘記,剛纔從給出的答案中知道它的存在和意義(因此我還是C++的新手),如果沒有,請幫助我澄清錯誤。謝謝 – KGCybeX

回答

2

你說你還不熟悉指針,所以我建議你不要使用char*作爲字符串(即C風格),因爲它主要基於指針的概念。

取而代之的是使用std::string,您必須首先使用#include<string>。它是一種更友好的類型:

std::string data_string; 

ReturnObject::ReturnObject(ReturnCode enum_code, std::string data) 

std::string ReturnObject::getData() 

並且您的代碼將被編譯。

const char簡單地是一個單個字符和一個恆定的(不可變的)。這可能不是你想要的。

如果你不熟悉指針,那麼你也沒有理由使用動態分配(new)。相反,只是砸獲得靜態分配:

_ReturnObject = ReturnObject(ReturnCode::LoginDialog_EmptyLoginPass, ""); 

new表示要創建的實例,直到你在它的指針,它可以在程序的任何地方撥打delete活路。

如果沒有new,只要_ReturnObject聲明的範圍被留下(即,如果封閉類實例被銷燬),該實例就會被銷燬。

在你的情況下,行會觸發一個新的錯誤,因爲new不是返回對象本身,而是一個指向它的指針,你試圖將該指針分配給一個非指針(_ReturnObject)。

此外,由於您使用的是我不太熟悉的Qt庫,因此最好使用其字符串實現QString。從查看文檔看來,您應該能夠直接在std::string的位置使用它。然而,std::string是每個C++編譯器和平臺始終可用的標準庫類型。

+0

我從哪裏開始,感謝您的解釋。這對我幫助很大。在C#和Java中,我們被教導使用'new',但直到現在才真正理解它的含義。謝謝! – KGCybeX

+1

@KGCybeX C++不同,'new'的含義在這裏完全不同。在Java中,一個對象在不再使用(垃圾收集)之後的某個時刻在後臺被銷燬。在C++中,對象被確定性地銷燬(當你離開它們的作用域時)或者你明確地要求它('刪除')。這意味着您必須確保您嘗試使用的對象實際上仍然存在。由於這個原因,例如參考文獻的工作方式也完全不同。 – user4407569

+1

@KGCybeX由於您使用的是QT庫,因此我在答案中添加了一些信息。 – user4407569

0

溶液後,可以加載一個簡單的字符到字符類型(例如, 'A')。如果你想要一個字符串,你必須使用char *或std :: string。 例如 char * data_string =「WARN」;

+0

所以char(例如java)引用單個字符,那麼char *是什麼意思? char []? – KGCybeX

+1

char *指向c/C++中每個指針所指向的內存部分。我假設你剛開始在java之後的C++中工作,所以我可以推薦你應該學習C++中的指針(因爲它是兩種語言之間最大的區別之一)。也許你也可以閱讀關於智能指針,這是在C++ 11中引入的,並提供更安全的內存管理 – mhajnal

+0

道歉,但我需要更多一點。 'char'是指''''或單個字符,而'char *'是指'「」'還是「字符串消息」? – KGCybeX

0

該錯誤來自作爲參數給出的對象類型。 ReturnObject的構造函數的第二個參數是一個char,但是你給出了一個"",它是一個空字符串(一個char數組,即「char *」)。

如果你編寫''而不是"",你的程序將編譯爲''用於表示一個空字符。但我不知道這是你需要實現什麼......

如果你想ReturnObject構造函數的第二個參數是一個字符串,那麼你應該通過

更換原型

ReturnObject(ReturnCode enum_code, const char data); 

ReturnObject(ReturnCode enum_code, const char * data); 

ReturnObject(ReturnCode enum_code, const QString data); 

更好,如果你這樣做,不要忘了到c根據您的選擇將標頭const char data_string的類型按const char * data_stringQString data_string更改爲標頭。同樣,const char getData();也應該分別替換爲頭部和執行const char * getData();const QString getData();

+0

「一個char數組,即」char *「」Untrue。它是一個'const char *'。字符串文字可能駐留在可能不可寫的內存中,因此是不變的。你明確地在問題的後面得到,但你知道...... TL; DR ..最好把這種區分放在前面。 – user4581301

+0

謝謝,與其他答案我明白我的問題,與您的解決方案,我已經找到了我正在尋找。謝謝你,如果你有一點時間,這將分叉我的問題,但在應用提出的'const char * data'解決方案後,我遇到了一個問題,尋找解決方案已經證明是徒勞的。如果你願意協助,你的意見將會被重視。另外我知道這是違反SO政策,但爲此創建一個新問題似乎不合邏輯,因爲我認爲這是一個小錯誤 – KGCybeX

相關問題