2015-12-21 148 views
1

的剛剛開始學習一些CPP和得到這個東西去:無效使用非靜態成員

#include <string> 

using std::string; 

class Vigenere{ 
    public: 
     Vigenere(string key, string alphabet = "abcdefghijklmnopqrstuvwxyz"); 
     string encode(string message, string key = _key, string alphabet = _alphabet); 
     string decode(string message, string key = _key, string alphabet = _alphabet); 


    private: 
     string _alphabet; 
     string _key; 
}; 

試圖編譯它說:「10 [錯誤]無效使用非靜態數據成員「的V @ genere的: :_鍵'」;

第10行是 string Key;

那麼,有沒有辦法讓它,所以我可以使用這些變量分別爲每個對象,而使用它們作爲默認參數?

+1

怎麼樣編譯器應該知道從哪個實例採取'Vigenere :: _字母'?那麼它將如何爲第一個實例省略參數的參數? – LogicStuff

+0

@LogicStuff該方法被調用的實例?沒有什麼是靜態的。 – Rotem

+1

另一件事 - [與領先的下劃線名稱](http://stackoverflow.com/questions/228783/what-are-the-rules-about-using-an-underscore-in-ac-identifier)保留爲在全局命名空間中執行。將它們用於其他事情可能不是最好的想法。 –

回答

7

據我所知,這不是直接可能的。

但你可以這麼做:

class Vigenere{ 
    public: 
     Vigenere(string key, string alphabet = "abcdefghijklmnopqrstuvwxyz"); 
     string decode(string message, string key, string alphabet); 
     string decode(string message, string key) 
     { 
      return decode(message, key, _alphabet); 
     } 
     string decode(string message) 
     { 
      return decode(message, _key, _alphabet); 
     } 

     // and same for encode 


    private: 
     string _alphabet; 
     string _key; 
}; 

它需要更多的源代碼行,但應該給類相同的接口的用戶,即

someVigenere.decode("myMessage");   // Use key, alphabet from the object instance 
someVigenere.decode("myMessage", "myKey"); // Use alphabet from the object instance 
someVigenere.decode("myMessage", "myKey", "myAlphabet"); // Pass all 
相關問題