【问题标题】:Functions out of scope error C++函数超出范围错误 C++
【发布时间】:2017-11-01 16:44:06
【问题描述】:

我的代码有一个class compROS。我创建了两个函数requestStart 和requestNotStart,它们试图从compROS 类中调用is_started_ 和sec_。现在每当我运行代码时,都会出现以下错误:

函数 requestStart 和 requestNotStart 和 is_started_ 和 sec_ 未在此范围内声明。

我的假设是不能从类外部访问私有函数。我应该将requestStart 和requestNotStart 添加为好友函数吗?

解决这些错误最有效的方法是什么?

以下是我的代码 -

(根据@Snps 和@Philip Brack 的cmets 更新了我的代码)

using namespace std;
namespace Lib
{
  class compROS
  {
    public:
      compROS(string error_text, int sec):
        error_text_(error_text),
        is_started_(false),
        sec_(sec)
        {
        }

    private:
      string error_text_;
      bool is_started_;
      int sec_;
  };
}

int requestStart(Lib::compROS& c)
{
  if(!c.is_started_)
    sec_ = 2;
    // Start timer
    // Timer expired
  c.is_started_ = true;
  return 0;
}

int requestNotStart(Lib::compROS& c)
{
  // <Code to be inserted>
  return 0;
}

int main (int argc, char **argv)
{
  Lib::compROS c("error", 2);
  requestStart(c);
  requestNotStart(c);

  return 0;
}

【问题讨论】:

  • requestStart() 不是你班级的成员,这意味着sec_ 和is_started_ 没有在requestStart() 中定义,你不能使用它们。
  • 看来你需要一个关于 c++ 的一般性修订......那代码没有意义。
  • 1. is_started_ 和 sec_ 不是函数。您也没有试图将它们视为函数。如果你称它们为函数,那就令人困惑了。 2.当您遇到编译错误时,请复制编译错误的文本,不要重新键入您认为重要的部分。
  • 需要一个您的预期用途示例。类成员函数和无友函数可能是同样可行的选择。

标签: c++ function class oop


【解决方案1】:

int compROS::requestStarted() { } 在类定义之后会将成员函数的范围限定为您的对象。您的问题是您声明了一个函数,但没有将其绑定到 compROS 类,因此您无法访问实例成员。

【讨论】:

  • 谢谢@Philip。我对此有一个后续问题。按照您建议的方式将我的函数绑定到类后,我能否访问private 中声明的变量?
  • 是的。在 C++ 中,成员函数可以访问私有成员。
  • 我已经在原帖中更新了我的代码。你能看看吗?我仍然无法访问私人成员。
【解决方案2】:

当您在 C++ 中创建一个类时,通常包括该类将使用(或可能使用)的函数,以及运行这些函数所需的变量。在您的情况下,您的 requestStart() 和 requestNotStart() 函数不包含在您的 compROS 类中,因为您的类中没有实际的函数调用。这就是为什么当您尝试运行程序时,您的函数 requestStart() 和 requestNotStart() 试图找到变量 is_started_ 和 sec_ 但没有找到它,因为这些变量只存在于类内部,而您的函数是在你的班级之外。我的建议是将requestStart() 和requestNotStart() 方法的函数签名放在public: 中,并通过仅使用函数签名来简化您的compPOS 方法,并在类之外实际实现该方法。

【讨论】:

  • 嗨@Patrick Chu。您能否详细说明您评论的最后一行?简化compROS 方法是什么意思?
  • 我在假设您的 comROS 是构造函数方法的情况下进行解释。本质上,您可以做的是在类括号 {} 之外实现实际方法,并且只在您的 comROS 类的括号中使用签名 comROS(string error_text, int sec)
【解决方案3】:

在面向对象编程中,类定义就像房子的蓝图。蓝图的厨房不能用,卫生间不能用,只能用它盖房子。

同样,在构建类的实例之前,您不能调用该类的任何方法。

Lib::compROS c("my error", 2);

任何想要调用任何类的方法的函数都需要知道在哪个实例上进行调用。您需要以某种方式传递对函数实例的引用。

int requestStart(Lib::compROS& c) {
    if(!c.is_started_)
        sec_ = 2;
        // Start timer
        // Timer expired
    c.is_started_ = true; // This member needs to be public for external access.
    return 0;
}

int main() {
    Lib::compROS c("my error", 2); // Create instance.
    requestStart(c); // Pass instance to function.
}

【讨论】:

  • 我按照您的建议更新了我的代码。但我仍然无法访问私人成员。
  • @dee19 不能从类外部访问私有成员。您需要公开成员、创建访问器方法(例如 setter)或定义友元函数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多