【问题标题】:implementing an accessor for a static variable in c++在 C++ 中实现静态变量的访问器
【发布时间】:2012-10-14 23:08:45
【问题描述】:

我是一名 CS 学生,现在我们正在学习继承。对于我们的作业,老师给了我们一个 main.cpp 文件和一个班级标题。我们希望在不更改给定文件的情况下创建标头的 .cpp 实现。我已经完成了大部分,但这是我无法实现的:

// File: employee.h

class Employee : public Person
{
private:
  static Company company;

public:
  static Company GetCompany();
  static void SetCompany(const Company& company);
}

这是我无法使用的 [static void SetCompany]。通常在实现中我会这样做

//  File: employee.cpp

void Employee::SetCompany(const Company& company) { this->company = company; }

但我收到错误“'this' 只能在非静态成员函数中使用”。我不确定我应该如何分配该变量,并且从未在课堂上解决过它。任何帮助,将不胜感激。请注意,这几乎是我希望保留的格式,所以希望任何建议都不会偏离太多。无论如何,提前谢谢,如果有什么需要澄清的,请告诉我......或者我只是对此感到盲目和/或愚蠢。

【问题讨论】:

  • 你的老师从来没有提到静态成员可以用他们的全名来称呼,在这种情况下是 Company::company?这真是一个疏忽。
  • 抱歉,我在原帖中打错字了。它应该是 Employee::SetCompany,而不是 Company::Company。我仍然不确定我应该如何使用它。是的,我的老师倾向于在没有任何真正解释的情况下匆忙通过幻灯片上的伪代码。无论如何,感谢您的快速响应。

标签: c++ inheritance implementation static-methods


【解决方案1】:

要访问静态字段,请使用Employee::company,因为您不能使用this,因为它是指一个类的实例。

你的二传手会变成

void Employee::SetCompany(const Company& company) { 
  Employee::company = company; 
}

但是如果你尝试简单地替换你的setter,你的编译器会抛出一个错误,说它不知道Employee::company。因为它不是实例化的。你需要,在你的 .cpp 文件中,你需要一个函数来声明你的字段

Company Employee::company;

【讨论】:

    【解决方案2】:

    要扩展之前的评论,您可以使用全名引用静态成员,例如Employee::company。因此,您应该能够通过简单地将函数更改为此来修复您的示例:

    static void SetCompany(const Company& company) { Employee::company = company; }
    

    这是因为静态成员变量独立于类的特定实例。 this 关键字指的是类的具体实例。所以,通过改变一个静态成员,类的所有实例化都会有这个改变。

    【讨论】:

      【解决方案3】:

      对于静态变量,您只引用类变量而不是实例。

      void Employee::SetCompany(const Company& company) {
          Employee::company = company;
      }
      

      【讨论】:

      • 员工::公司 = 公司;但足够接近。谢谢:D
      【解决方案4】:

      我认为了解编译器和语言范围规则对您来说很重要。当方法(静态或其他)具有名称为“company”的 PARAMETER,但该类具有名称为“company”的可访问成员(静态或其他)时,解析裸名称“company”的规则是什么“?如果没有名为 company 的参数,您如何/应该如何引用该成员?

      这是另一个问题 - 如果有一个名为 company 的 LOCAL 参数怎么办?

      void Employee::CompareCompany(const Company &company)
      {
        Company company("another company");
        // which company is being referenced on the LHS (left hand side)
        // of the == expression below? The method parameter or the local variable?
        if (company == Employee::company)
          stout << "They match!"
      }
      

      你认为我继续使用相同的名字是个好主意吗?它们都是Company的实例,那么为什么“company”对它们来说不是一个好名字???

      【讨论】:

      • 我很欣赏这个想法,但就像我说的,这是一个学校项目,其中头文件是预先编写的,应该按原样使用。我对变量的命名没有发言权,只是实现它们。
      • 同意,但问题仍然有效——无论谁编写了原始代码,您都需要了解编译器的规则。如果您必须修改以这种方式编写的现有代码怎么办?相信我,您会经常查看其他人的代码(并希望意识到其他人会查看您的代码)。
      猜你喜欢
      • 1970-01-01
      • 2010-10-19
      • 1970-01-01
      • 2015-06-12
      • 1970-01-01
      • 1970-01-01
      • 2015-02-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多