2

我是一名 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' 只能在非静态成员函数中使用”。我真的不确定我应该如何分配变量,并且从未在课堂上解决它。任何帮助,将不胜感激。请注意,这几乎是我希望保留的格式,所以希望任何建议都不会偏离太多。无论如何,提前感谢并让我知道是否需要澄清任何事情......或者我只是对此感到盲目和/或愚蠢。

4

4 回答 4

4

要访问静态字段,请使用Employee::company,因为您不能使用this它,因为它旨在引用类的实例。

你的二传手将成为

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

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

Company Employee::company;
于 2012-10-14T23:17:43.270 回答
1

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

void Employee::SetCompany(const Company& company) {
    Employee::company = company;
}
于 2012-10-14T23:16:28.537 回答
1

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

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

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

于 2012-10-14T23:18:02.140 回答
0

我认为了解编译器和语言范围规则对您很重要。当方法(静态或其他)具有名称为“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”对它们来说不是一个好名字???

于 2012-10-14T23:51:10.103 回答