2013-06-11 75 views
0

我想向C++代碼中的向量添加一些值,但是每次嘗試將向量發送到main.cpp文件中的函數時,它都會以紅色突出顯示它並說:將std :: vector傳遞給函數

A nonstatic member reference mus be relative to a specific object. 

在我的頭:

#ifndef HEADER_H 
#define HEADER_H 
#include <vector> 

namespace Functions{ 
    class MyClass 
    { 
    public: 
     void fun(std::vector<char*> vect); 

    }; 

} 
#endif 

.cpp文件:

void Functions::MyClass::fun(std::vector<char*> vect){ 
    vect.push_back("value 1"); 
    vect.push_back("Save File Name"); 
} 

Main.cpp的

#include "Header.h"  
#include <vector> 
int main(){ 
    std::vector<char*>vect; 
    Functions::MyClass::fun(vect); 
    return 0; 
} 
+3

您可能想通過引用傳遞該向量。 –

+0

創建類的對象並將其作爲參考傳遞給它。 – shivakumar

回答

4

你有兩個問題:

  1. 要調用非沒有對象的靜態函數。爲了解決這個問題聲明MyClass類型的對象,並對其調用fun

    int main(){ 
        Functions::MyClass a; 
        std::vector<char*>vect; 
        a.fun(vect); 
        return 0; 
    } 
    
  2. 你只在你的函數修改vect本地副本。爲了解決這個問題通過引用傳遞載體中,位於功能:

    void Functions::MyClass::fun(std::vector<char*>& vect){ 
        vect.push_back("value 1"); 
        vect.push_back("Save File Name"); 
    } 
    

當然聲明也應相應地改變。

+0

OP:請考慮接受Andy Prowl的答案,而不是我的答案,因爲它更詳細,並且還提出了另一個重要改進。 –

+1

我認爲它是好的,你的回答很好;-) –

10

您正在調用您的fun()成員函數,就像它是靜態函數一樣。由於這是一個普通的成員函數來代替,你應該創建一個對象上調用它:

Functions::MyClass m; 
m.fun(vect); 

如果你的函數不需要在類的任何具體情況下工作,它是一個成員,你可以將其聲明爲static。這將允許您按照您當前所稱的方式稱呼它。

此外,正如其他人已指出,這可能是一個好主意,通過參考傳遞載體

void fun(std::vector<char*>& vect) 
//      ^

路過值將vect創建副本的說法,這意味着呼叫功能在撥打fun()後不會看到任何副作用。

而且,一個好主意是使用std::string,而不是指向char(特別是如果沒有const):

#include <string> // Requires for std::string 

// ... 

void Functions::MyClass::fun(std::vector<std::string>& vect) 
//          ^^^^^^^^^^^ 
{ 
    vect.push_back("value 1"); 
    vect.push_back("Save File Name"); 
} 
+0

如果我是那個選擇我會接受這個答案。 'std :: string'非常好,我沒有注意到'char *'的用法。 –

相關問題