2013-03-26 71 views
0

我正在學習C++,在使用類時非常新,在嘗試使用它們時我感到非常困惑。我試圖轉換我現有的代碼(它使用了結構),以便它使用類 - 所以當我知道我在做什麼時,我不知道我是否正確地做了它。使用類功能

有人告訴我,當使用類中的函數時,我首先需要實例化類的一個對象。所以我在我的主要功能中嘗試過(一個片段)是:

int main()// line 1 
{ 
    string message_fr_client = "test"; //line2 

    msgInfo message_processed; //line 3 
    message_processed.incMsgClass(message_fr_client); //line 4 

    if (!message_processed.priority_check(qos_levels, message_processed)) //line 5 
     cout << "failure: priority level out of bounds\n"; //line 6 

    return 0; //line 7 
} 

你能幫我澄清一下,我的下列假設是正確的嗎?編譯器沒有顯示任何錯誤,所以我不知道它是否沒有錯誤,或者是否有潛在的錯誤。

  1. 在第4行中,對字符串message_fr_client正在執行的功能和incMsgClass返回所得到的(改性)message_processed
  2. 在第5行,函數priority_check正在message_processed上執行並返回一個布爾值?
  3. 在我的班級定義中,我有一個功能getPath,意思是修改nodePath的值 - 這僅僅是使用message_processed.getPath(/*arguments*/)的問題嗎?

我沒有包括的功能的身體,因爲我知道他們的工作 - 我只是想找出如何類的功能進行交互。請讓我知道,如果我可以更清楚 - 只是想澄清一些混淆。

這是我的類:

#ifndef clientMsgHandling_H 
#define clientMsgHandling_H 

#include <list> 
#include <map> 
#include <queue> 

class msgInfo 
{ 
public: 
    msgInfo(); 
    msgInfo(int, int, int, std::string, std::list<int>); 

    /*classifying message*/ 
    msgInfo incMsgClass(std::string original_msg); 

    /*message error checks*/ 
    bool priority_check(int syst_priority, msgInfo msg); //check that message is within qos levels 
    bool route_check(std::map<std::pair<int, int>, int> route_table, msgInfo msg); //check that route exists 

    void getPath(msgInfo msg, std::map<std::pair<int, int>, int> route_info, int max_hop); 

private: 
    int source_id; 
    int dest_id; 
    int priority; 
    std::string payload; 
    std::list<int> nodePath; 
}; 

#endif 
+0

對不起,我不能接受多個答案,但謝謝大家! - 所有位和bobs幫助 – sccs 2013-03-27 07:25:33

回答

0

雖然它可能編譯(甚至運行),有與代碼的一些古怪如圖所示: -

首先,類方法知道哪個對象,他們正在操作 - 讓你的priority_checkroute_check可能方法不需要msgInfo作爲參數,

例如,舊的非類函數可能是這樣的

bool priority_check(int p, msgInfo msg) 
{ 
    return msg.priority < p; 
} 

但新的一個應該是這樣的:

bool msgInfo::priority_check(int p) 
{ 
    return priority < p; 
} 

另外,incMsgClass有點奇怪,因爲它是一個非靜態類方法,它返回一個msgInfo對象。不理解它應該做什麼很難說,但這個函數似乎應該是一個構造函數,而不是一個常規方法。

另一件事是,您正在向這些方法傳遞值爲的msgInfo 。所以如果該方法需要修改傳遞的msgInfo,它不會有任何影響。通過引用或const引用傳遞對象通常更好。所以,回到以前的非方法示例,它應該是這樣的。

bool priority_check(int p, const msgInfo &msg) 
... 

但是,正如我說的,你可能不需要msgInfo參數反正。

+0

只是澄清 - 我剛剛改變它看起來像'bool msgInfo :: priority_check(int p){}',這是否意味着當我使用'message_processed。 priority_check(x)',它會知道檢查'message_processed'是否滿足該條件,這就是爲什麼我不必將它作爲參數傳遞的原因? – sccs 2013-03-26 09:32:03

+0

是的:'引擎蓋下',當一個對象的方法被調用時,一個指向該對象的指針被作爲一種隱藏的參數傳遞給'this'。所以當你寫'priority'時,它與'this-> priority'相同。你使用'std :: string',所以看看'length()'是如何定義的。 – Roddy 2013-03-26 10:33:23

0

在第4行,是對字符串message_fr_client

正在執行incMsgClass功能並返回所得到的(並修改)message_processed?

無論返回什麼,你都忽略了返回值。它可以修改對象本身,是的,因爲該函數不是const。

在第5行,函數priority_check正在對message_processed執行並返回一個布爾值?

在我的類定義,我有一個函數的getPath,是爲了修改的NodePath的價值 - 它只是一個用message_processed.getPath的事(/ 參數 /) ?

如果一個成員函數旨在修改類的成員之一,它只是一個沒有標記這個函數常量

+0

對於第1點,如果我做了'message_processed = message_processed.incMsgClass(message_fr_client);'而不是原始的,那意味着'message_processed'現在已被修改? – sccs 2013-03-26 09:19:54

+0

@SCCS:如果incMsgClass實際上修改了message_processed,那麼它是一樣的。在你的評論中的解決方案只是一個低效率的複製 – 2013-03-26 09:51:27

0

很難說沒有實施細節的問題,但在這裏我們去:

I.您正在傳遞std::string作爲值(C++默認爲按值呼叫),因此您會在方法中獲得std::string的副本。如果你想給你傳遞的對象上工作,並對其進行操作,使用對象的引用,像

msgInfo incMsgClass(std::string& original_msg); // notice the ampersand 

那麼您可以將您的簽名更改爲

void incMsgClass(std::string& original_msg); 

因爲你並不需要返回您通過的std::string

二,是的,至少根據您的簽名

三。只能看到node_path作爲成員。

有關您的所有問題,請參閱C++-FAQ

0

您的基本假設是正確的。

message_processed.incMsgClass(message_fr_client); //line 4 

此行不正確。您致電的功能將返回msgInfo,該功能將被簡單地刪除。你應該把它分配給某個東西。但它不像通常那樣。你應該讓msgInfo的構造,就像

class msgInfo 
{ 
public: 
    msgInfo(std::string original_msg); 
... 
} 

然後,你可以這樣調用

msgInfo message_processed(message_fr_client); 

這條線將創建一個已經正確初始化一個msgInfo。

還有另一種創建類實例的模式 - 靜態創建函數。你的情況,你可能標誌着incMsgClass靜態,然後調用它像

msgInfo message_processed = msgInfo.incMsgClass(message_fr_client); 

我嚴重懷疑你在這裏需要這種模式,所以我建議移動到構造函數。

至於其他功能,我沒有看到那裏的問題。請注意,沒有標記爲const的所有成員函數都可以修改它們被調用的對象。所以,你不需要明確地傳遞這個對象。對於函數,指向它們被調用的對象的指針可以按名稱this提供。此外,函數可以訪問所有類變量,就像這些變量對於普通(非成員)函數是全局變量一樣。