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

私が使用できないのは[staticvoidSetCompany]です。通常、実装では私はただやるでしょう

//  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; 
}

しかし、単にセッターを置き換えようとすると、コンパイラーは、それがわからないというエラーをスローします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。したがって、関数を次のように変更するだけで、例を修正できるはずです。

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

これは、静的メンバー変数がクラスの特定のインスタンスから独立しているためです。thisキーワードは、クラスの特定のインスタンスを参照します。したがって、静的メンバーを変更することにより、クラスのすべてのインスタンス化にこの変更が加えられます。

于 2012-10-14T23:18:02.140 に答える
0

コンパイラと言語のスコープ規則を理解することが重要だと思います。メソッド(静的またはその他)に「company」という名前のPARAMETERがあり、クラスに「company」という名前のアクセス可能なMEMBER(静的またはその他)がある場合、裸の名前「company」を解決するためのルールは何ですか。 「?companyという名前のパラメーターがなかった場合、メンバーをどのように参照できますか/参照する必要がありますか?

もう1つのしわがあります-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 に答える