在c ++中实现静态变量的访问器

时间:2012-10-14 23:08:46

标签: c++ inheritance implementation static-methods

我是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);
}

这是我无法使用的[静态无效SetCompany]。通常在实施中我只是做

//  File: employee.cpp

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

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

4 个答案:

答案 0 :(得分:4)

要访问静态字段,请使用Employee::company,因为您无法使用this,因为它意味着引用类的实例。

你的二传手将成为

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

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

声明字段的函数一样
Company Employee::company;

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

要扩展早期评论,您可以引用静态成员及其全名,例如Employee::company。所以,你应该能够通过简单地将函数更改为:

来修复你的例子
static void SetCompany(const Company& company) { Employee::company = company; }

这是因为静态成员变量独立于类的特定实例。 this关键字指的是该类的特定实例。因此,通过更改静态成员,类的所有实例都会进行此更改。

答案 3 :(得分:0)

我认为理解编译器和语言范围规则很重要。当方法(静态或其他方式)具有名称为“company”的PARAMETER,但该类具有可访问的MEMBER(静态或其他),其名称为“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!"
}

你认为我继续使用相同名称是个好主意吗?他们都是公司的实例,为什么“公司”不是所有公司的好名字?