Я студент 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» может использоваться только внутри нестатической функции-члена ». Я не совсем уверен, как еще я должен назначить переменную, и она никогда не была адресована в классе. Любая помощь будет оценена. Просто отметьте, что это в значительной степени тот формат, который я собираюсь сохранить, так что, надеюсь, любой совет не будет слишком частым. В любом случае, спасибо заранее и дайте мне знать, если что-то нужно прояснить … или я просто ослеп и / или глуп по этому поводу.
Чтобы получить доступ к статическому полю, используйте Employee::company
, как вы не можете использовать this
потому что он предназначен для ссылки на экземпляр класса.
Ваш сеттер станет
void Employee::SetCompany(const Company& company) {
Employee::company = company;
}
Но если вы попытаетесь просто заменить сеттер, ваш компилятор выдаст ошибку, сказав, что он не знает Employee::company
, Потому что это не экземпляр. Вам нужно, в вашем файле .cpp, как вы сделали бы с функцией, чтобы объявить ваше поле с
Company Employee::company;
Чтобы расширить предыдущий комментарий, вы можете сослаться на статические элементы с их полным именем, например Employee::company
, Таким образом, вы сможете исправить ваш пример, просто изменив функцию на эту:
static void SetCompany(const Company& company) { Employee::company = company; }
Это потому, что статические переменные-члены не зависят от конкретного экземпляра класса. this
Ключевое слово относится к конкретному экземпляру класса. Таким образом, изменяя статический член, все экземпляры класса имеют это изменение.
Для статических переменных вы просто ссылаетесь на переменную класса, а не на экземпляр.
void Employee::SetCompany(const Company& company) {
Employee::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!"}
Как вы думаете, это хорошая идея для меня, чтобы продолжать использовать то же имя? Они все являются примерами компании, так почему же «компания» не является хорошим названием для всех них ???