C 通过未知名的变量到方法

C++ Pass variable of unknown name to method

本文关键字:变量 方法 未知      更新时间:2023-10-16

在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方法。实际上,拥有多个会导致多个定义错误,因为您定义了两种具有相同签名的方法。

只需用不同的参数称呼它:

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

似乎您想传递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);

似乎您想通过更改签名中的名称来更改函数的语义。那不是它的工作方式。正如克里斯在评论中指出的那样,无论您通过什么string,函数的语义保持不变 - 只有返回值才会更改,具体取决于CheckFile返回中使用的功能。给字符串一个不同的名称不是创建另一个CheckFile的过载,并且不会以任何方式更改功能中的语义或代码流。

您想要的是每个用途的专用功能。CheckFile应该只做名称所建议的事情(好吧):检查是否存在由您通过的string表示的txt文件。

CheckFile上分层您可能需要实现其他功能,以检查不同类型的文件。话虽如此,如果您要处理文本文件,则需要解析和验证内容,以确保您实际上有一个有效的用户文件或库存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      
}

类似于股票-INFO文件。

在另一个注意事项上,无需使这样的函数a 成员函数 LotterySystem ,如果您坚持使其成为成员函数,请考虑使其成为static成员函数 - 它是't取决于 LotterySystem的实例。

另外,如果我正确理解您的意图,您要检查文件是否存在。因此,如果CheckFile功能可以打开文件,则需要返回true。目前,它确实相反。如果我错了,请发表评论。

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