2014-01-27 74 views
-4

有沒有辦法在C++中傳遞一個變量,其中該變量可能是幾個不同的變量之一(相同類型),具體取決於方法的調用方式。C++將未知名稱的變量傳遞給方法

例如:

一種方法來檢查文件是否存在正確的名稱。

在程序中的一個點,我可能要檢查用戶的文件存在,所以用戶輸入自己的用戶名到字符串變量名,並傳遞給CheckFile:

bool LotterySystem::CheckFile(const std::string &USERNAME) 
{ 
    //if file exists, return false, else return true 
    FILE *fin = fopen((USERNAME + ".txt").c_str(), "r"); 
    if (fin) 
    { 
     fclose(fin); 
     return false; 
    } 
    return true; 
} 

另一點我可能要檢查一個文件,股票信息存在,所以用戶輸入他們希望簽入字符串變量stockType股票:

bool LotterySystem::CheckFile(const std::string &STOCKTYPE) 
{ 
    //if file exists, return false, else return true 
    FILE *fin = fopen((STOCKTYPE + ".txt").c_str(), "r"); 
    if (fin) 
    { 
     fclose(fin); 
     return false; 
    } 
    return true; 
} 

有沒有辦法通過一個通用的字符串變量與任何名義,向CheckFile,而不必有不同的Chec kFile方法爲每個文件名被檢查?

+0

這兩個函數都完全相同。 – chris

+1

您對參數如何傳遞給方法和函數有一個基本的誤解。 – Jesper

+0

參數名稱與您傳遞給它的變量的名稱完全無關。具有*語言參數程序的要點是你可以向它們傳遞不同的東西。 – molbdnilo

回答

1

你不需要不同的CheckFile方法。實際上,多於一個會導致多重定義錯誤,因爲您定義了兩個具有相同簽名的方法。

只是用不同的參數來調用它:

LotterySystem ls; 
ls.CheckFile("MyNameIsFred"); 
ls.CheckFile("MyPreferredPreferredStockName"); 
0

好像你想傳遞const std::string類型的不同值,這在C++可以簡單地使用單一功能進行傳遞。您將必須更改您調用該函數的值,而不是創建bool LotterySystem::CheckFile方法的不同實例。

而且,沒有編譯器會編譯具有相同參數的相同函數的兩個實例。

bool LotterySystem::CheckFile(const std::string &USERNAME) 
{ 
    //if file exists, return false, else return true 
    FILE *fin = fopen((USERNAME + ".txt").c_str(), "r"); 
    if (fin) 
    { 
     fclose(fin); 
     return false; 
    } 
    return true; 
} 

然後調用:

LotterySystem mySystem; 
std::string sName = "John Doe", sStockName = "ZXY"; 
bool nameFileExists = mySystem.CheckFile(sName); 
bool stockFileExists = mySystem.CheckFile(sStockName); 
0

好像你想在簽名更改名稱改變函數的語義。這不是它的工作原理。正如Chris在評論中所說的,函數的語義保持不變,無論你通過了什麼樣的string - 只有返回值會改變,這取決於CheckFile中返回的函數。爲字符串賦予不同的名稱而不是創建另一個CheckFile的重載,並且不會以任何方式更改該函數中的語義或代碼流。

你想要的是一個專用功能的用途。 CheckFile應該按照名稱的建議進行操作(以及類型):檢查您傳遞的string表示的txt文件是否存在。

分層CheckFile您可能需要實現其他功能以檢查不同類型的文件。這就是說,如果你正在處理文本文件,你需要解析和驗證內容,以確保你實際上擁有一個有效的用戶文件或股票信息文件。實質上,你需要這樣的東西:

bool IsUserFile(const std::string&); // validates text-file contents 

bool processUserFile(const std::string& path) // path omitting the extension '.txt' 
{ 
    if(!(CheckFile(path) && IsUserFile(path))) 
    return false; 

    // open file process contents 
    // return true if successful, false otherwise  
} 

類似的股票信息文件。

在另一方面,沒有必要做出這樣的功能的成員函數的LotterySystem,如果你堅持要使它成爲一個成員函數,可考慮將其static成員函數 - 它不依賴於一個實例LotterySystem

此外,如果我理解你的意圖正確,你想檢查一個文件是否存在。因此,如果CheckFile函數可以打開文件,則需要返回true。目前,它完全相反。如果我錯了,留下評論。

請注意:僅通過查看您的應用程序是否可以打開文件來檢查文件的存在是非常有限的情況。它可能存在,並且fopen()可能仍然無法打開它,無論是由於權限不足或其他條件。