【问题标题】:C++ Pass variable of unknown name to methodC ++将未知名称的变量传递给方法
【发布时间】:2014-01-27 14:01:30
【问题描述】:

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 方法?

【问题讨论】:

  • 这两个函数的作用完全相同。
  • 您对如何将参数传递给方法和函数有一个根本性的误解。
  • 参数名与你传递给它的变量名完全无关。在语言中拥有过程的主要目的是您可以向它们传递不同的东西。
  • 你的编译器不懂英文

标签: c++ file variables methods


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      您似乎想通过更改签名中的名称来更改函数的语义。这不是它的工作原理。正如 chris 在 cmets 中所说,无论您传递什么 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() 可能仍然无法打开它,可能是由于权限不足或其他条件。

      【讨论】:

        猜你喜欢
        • 2014-12-31
        • 2012-11-06
        • 1970-01-01
        • 1970-01-01
        • 2017-07-21
        • 2016-01-01
        • 2016-04-20
        • 2020-06-20
        相关资源
        最近更新 更多