Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在c+中实现静态变量的访问器+;_C++_Inheritance_Implementation_Static Methods - Fatal编程技术网

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

C++ 在c+中实现静态变量的访问器+;,c++,inheritance,implementation,static-methods,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 Se

我是一名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'只能在非静态成员函数中使用”。我真的不知道我应该如何分配这个变量,而且在课堂上从来没有提到过。任何帮助都将不胜感激。请注意,这几乎是我希望保留的格式,所以希望任何建议都不会偏离太多。无论如何,提前谢谢你,如果有什么需要澄清的,请告诉我。。。或者,如果我只是对此视而不见和/或愚蠢。

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

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

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

你的二传手将成为

void Employee::SetCompany(const Company& company) { 
  Employee::company = company; 
}
但是如果您试图简单地替换setter,编译器将抛出一个错误,说它不知道
Employee::company
。因为它不是实例化的。您需要在.cpp文件中使用一个函数来声明字段

Company Employee::company;

要展开前面的注释,您可以引用带有全名的静态成员,例如
Employee::company
。因此,您应该能够通过简单地将函数更改为以下内容来修复您的示例:

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

这是因为静态成员变量独立于类的特定实例。
this
关键字引用类的特定实例。因此,通过更改静态成员,类的所有实例化都会发生这种更改。

我认为理解编译器和语言范围规则非常重要。当一个方法(静态或其他)有一个名为“company”的参数,但该类有一个名为“company”的可访问成员(静态或其他)时,解析裸名称“company”的规则是什么?如果没有名为company的参数,如何引用成员

这里还有一个问题-如果有一个名为company的本地参数,该怎么办

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!"
}
void Employee::CompareCompany(const Company&Company)
{
公司(“另一家公司”);
//LHS上引用的是哪家公司(左侧)
//下面的==表达式的参数是方法参数还是局部变量?
如果(公司==员工::公司)

stout你的老师从来没有提到静态成员可以用全名称呼,在这种情况下是Company::Company?这是一个很大的疏忽。对不起,我在我原来的帖子中打错了。它应该是Employee::SetCompany,而不是Company::Company。我仍然不确定我应该如何使用它。是的,我的老师往往会匆匆通过pseu在没有任何实际解释的powerpoint上记录代码。无论如何,感谢您的快速响应。Employee::company=company;但是非常接近。谢谢:我很欣赏这个想法,但正如我所说,这是一个学校项目,头文件是预写的,应该按原样使用。我在命名变量方面没有发言权,只是实现它们。Agreed,但问题仍然有效-无论是谁编写了原始代码,您都需要理解编译器的规则。如果您必须修改以这种方式编写的现有代码,该怎么办?相信我,您将经常查看其他人的代码(并希望意识到其他人也会查看您的代码)。