C ++将未知名称的变量传递给方法

时间:2014-01-27 14:01:31

标签: c++ file variables methods

c ++中是否有一种方法可以将变量传递给方法,其中该变量可以是几个不同变量(相同类型)中的一个,具体取决于调用方法的位置。

例如:

检查文件是否存在且名称正确的方法。

在程序的某一点上,我可能想要检查用户文件是否存在,因此用户将其用户名输入到字符串变量username中,并将其传递给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,而不必为每个要检查的文件名设置不同的CheckFile方法?

3 个答案:

答案 0 :(得分:1)

您不需要使用不同的CheckFile方法。实际上,拥有多个会导致多重定义错误,因为您定义了两个具有相同签名的方法。

只需用不同的参数调用它:

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

答案 1 :(得分: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);

答案 2 :(得分:0)

您似乎希望通过更改签名中的名称来更改函数的语义。这不是它的工作原理。正如Chris在注释中所述,函数的语义保持不变,无论您传递的是什么string,只有返回值会发生变化,具体取决于CheckFile返回时使用的函数。给字符串一个不同的名称​​不创建CheckFile的另一个重载,并且不会以任何方式改变函数内的语义或代码流。

您想要的是每个目的的专用功能。 CheckFile应该按照名称的建议(好吧,排序):检查您传递的txt所表示的string文件是否存在。

分层在CheckFile上,您可能希望实现其他功能,以便检查不同类型的文件。话虽这么说,如果你正在处理文本文件,你需要解析和验证内容,以确保你确实有一个有效的用户文件或stock-info文件。从本质上讲,你想要这样的东西:

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成员函数,如果您坚持将其作为成员函数,请考虑将其设为{{1}成员函数 - 它不依赖于static的实例。

另外,如果我理解你的意图,你想检查文件是否存在。因此,如果LotterySystem函数可以打开文件,则需要返回CheckFile函数。目前,它恰恰相反。如果我弄错了,请发表评论。

请注意:仅通过查看您的应用程序是否可以打开它来检查文件的存在是一个非常有限的情况。它可能存在且true可能仍然无法打开它,无论是由于权限不足还是其他条件。