2011-07-18 80 views
1

我正在使用不同的類和對象來關聯這些不同的類。現在,我想寫一個單獨的函數,用於將兩個矢量連接到另一個矢量。我應該在哪裏寫這些類型的獨立函數。我可以使用一個新的頭文件嗎?實際上,我做了一個新的頭文件(ConnectedSegment.h),並把它放在我的功能下。但是,我得到了這個錯誤。如何在沒有對象的情況下編寫和調用函數當我們不想用對象調用

43 D:myex\ConnectedSegment.h non-member function `std::vector<int>& NeighboursToGivenValue(std::map<int, std::vector<int> >&, int, int)' cannot have `const' method qualifier 

D:\myex\Detects\Makefile.win [Build Error] [Detects.o] Error 1 

這裏是我的功能代碼:

vector<int> & NeighboursToGivenValue(map<int, vector<int> > &adjacency, 
               int s1, int s2) const 
{ 
    vector<int>::const_iterator any; 
    vector<int>::iterator is_any; 
    vector<int> *neighbours2both = new vector<int>; 
    int i; 

    neighbours2both->reserve(adjacency[s1].size() + adjacency[s2].size()); 
    neighbours2both->insert(neighbours2both->end(), adjacency[s1].begin(),adjacency[s1].end()); 

    vector<int>& neighbours2s2=adjacency[s2];   
    for (any=neighbours2s2.begin(); any!=neighbours2s2.end(); any++){    
     is_any = find (neighbours2both->begin(), neighbours2both->end(), *any);   
     if(is_any == neighbours2both->end()){ 
      if(s1 != *any) neighbours2both->push_back(*any); 
     } 
    } 
    for (i=0; i<neighbours2both->size(); i++){ 
     neighbours2both->erase(neighbours2both->begin() + i); 
    } 
    return(*neighbours2both); 
} 

在這裏,我通過使用叫做MyPoint另一個類得到了adjacency()值。 所以我用myxyz.adjacency()來調整這個鄰接的值。現在我不想調用同一類MyPoint來調用函數NeighboursToGivenValue。所以, 你能告訴我應該在哪裏寫這個函數。或者,如果我在MyPoint類中編寫此函數,如何在沒有該類的對象的情況下調用此函數。

+1

請格式化您的問題,以便代碼清晰可辨。 –

+1

@g_niro:我試着修復你的問題,但是這個語言很難理解。請再次閱讀,並嘗試修復像*這樣的句子,我應該寫這些類型的單獨函數正在寫*。 –

+0

請使用'{}'按鈕來格式化您的代碼。只需用鼠標選擇代碼,然後按編輯器中的「{}」按鈕。如果我們無法讀取您的代碼,則很難回答您的問題。 – jalf

回答

1

這些免費功能,可在頭(需要聲明inline爲佩德羅強調了他的評論) - 或者他們可以在頭中聲明,並且在實現文件中定義的 - 例如,

#header 

vector<int>& join_int_vector(vector<int> const& lhs, vector<int> const& rhs); 

# cpp 

vector<int>& join_int_vector(vector<int> const& lhs, vector<int> const& rhs) 
{ 
// do stuff 
} 

你面臨的問題是,你可以只有const成員函數 - 即自由函數(和靜態函數)不能是const - 它並不意味着什麼。

btw。不動態地構造一個向量,並返回對它的引用,即:

vector<int> *neighbours2both = new vector<int>; 
: 
return (*neighbours2both); 

被叫方沒有認識到這個對象需要被手動清理 - 在這種情況下,通過返回值。

vector<int> join_int_vector(vector<int> const& lhs, vector<int> const& rhs) 
{ 
    vector<int> neighbours2both; 
    : 
    return neighbours2both; 
} 

編輯:在頭本身定義的功能,這樣的事情:

inline vector<int> join_int_vector(vector<int> const& lhs, vector<int> const& rhs) 
{ 
    vector<int> neighbours2both; 
    : 
    return neighbours2both; 
} 

注意使用關鍵字inline的 - 這可以防止多個定義錯誤,如果這個頭被包含在多個翻譯單位。

+0

如果頭文件中定義了空閒函數,它們可能需要「內聯」,以免發生多重定義錯誤。 –

+1

@佩德羅,當然 - 我遺漏了那個小塊,會加... – Nim

+0

@尼姆,非常感謝你的明確的例子。但是,我不確定我是否應該使用內聯。所以,如果我使用h文件和cpp文件進行免費函數的聲明和實現,我需要內聯嗎?可能你可以給我內聯的例子,以獲得更清晰的想法。非常感謝... – niro

相關問題