2015-07-12 92 views
0

我有一個保存學生數據的類。在存儲之前,如果有效或無效,將首先檢查ID。在重載操作符>>時,我調用validate_id函數。我已經宣佈它是朋友,但是編譯時,它說'validate_id was not declared in scope。是因爲它的靜態功能嗎?未在範圍錯誤中聲明

#include <iostream> 
#include <string> 
#include <locale> 
#include <utility> 
#include <algorithm> 
#include <stdexcept> 


typedef std::pair<std::string, std::string> Name; 

class Student { 

    public: 
     Student(){}; 

     bool operator <(const Student& rhs) const { 
      return (id_ < rhs.id_); 
     } 

    friend std::ostream& operator <<(std::ostream& os, const Student& s); 
    friend std::istream& operator >>(std::istream& is, Student& s); 

    private: 
    std::string  id_; 
    Name  name_; 

    static bool validate_id(const std::string& id){ 
     if(id.length() != 9 && id[0] != 'a') 
      return false; 

     for(size_t i = 1, sz = id.length(); i < sz; i++){ 
      if(!isdigit(id[i])) 
       return false; 
     } 

      return true; 
    } 

}; 


std::ostream& operator <<(std::ostream& os, const Student& s){ 
    return os << s.id_ << " " << s.name_.first << " " << s.name_.second; 
} 

std::istream& operator >>(std::istream& is, Student& s){ 
    is >> s.id_ >> s.name_.first >> s.name_.second; 

    if(!validate_id(s.id_)) // error here, says validate_id is not in scope 
     throw std::invalid_argument("invalid ID"); 


    return is; 
} 
+2

你缺少範圍解析運算符::因爲它是一個成員 – blade

+0

謝謝,我添加了'Student :: validate_id'並且它現在編譯。 – XDProgrammer

+1

這是一個很好的審查運算符重載在c + + http://stackoverflow.com/questions/4421706/operator-overloading – blade

回答

3

validate_idStudent靜態成員,所以你需要使用類範圍,以它命名爲:

if(!Student::validate_id(s.id_)) 
    ^^^^^^^^^ 
+0

謝謝,我忘了那個..我的代碼現在編譯 – XDProgrammer

-1

要麼聲明validate_idStudent類的或呼叫Student.validate_id

+0

沒有必要公開。流操作符是「朋友」。 – juanchopanza

+0

我聲明,這個類裏面有一個朋友函數,但是它仍然說沒有在範圍 – XDProgrammer

+0

啊,真的,我錯過了,當瀏覽代碼時。 –

0

當你調用C++中的靜態成員函數,你必須與調用它類範圍。這意味着在這裏你必須使用 !Student::validate_id(s_id)

靜態的含義是,你所宣稱的任何東西都是類範圍。不適用於對象範圍。這就是爲什麼你必須在課堂上稱呼它。

相關問題