@detcelfer

Как правильно объявить функцию, использующую переменную из класса, и класс включающий в себя использование этой функции?

Приведу пример:
//объявление функции
void someUniversalTool() {
  int variable1 = someClass.variableInClass ;
  //some additional code
}
//объявление класса
class someClass {
public:
  void someClassTool() {
    someUniversalTool();
    //some additional code
  }
  int variableInClass = 5;

} Someclass someclass;

В данном случае при компиляции будет ошибка: 'someclass' was not declared in this scope;
Если поменять местами объявления функции и класса возникнет ошибка: 'someUniversalTool()' was not declared in this scope;

Как объявить их так, чтобы избежать подобных ошибок?
  • Вопрос задан
  • 262 просмотра
Решения вопроса 2
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
Как объявить их так, чтобы избежать подобных ошибок?

Очень странная конструкция в коде:
- если это такой уж univeralTool, то зачем он завязывается на поле какого-то конкретного объекта какого-то класса?
- если уж надо завязаться на поле объекта, то почему эта функция -- не член этого класса?
- если надо обработать какое-то значение, то почему не передать это значение как аргумент функции?

Ну и если и ни то и ни сё, и действительно надо как написано в коде -- то раздели всё на части и используй объявления или упорядочи определения функций как следует, например так:
class someClass {
public:
  void someClassTool();
  int variableInClass = 5;
};

Someclass someclass;

void someUniversalTool()
{
  int variable1 = someClass.variableInClass ;
  //some additional code
}

void SomeClass::someClassTool()
{
   someUniversalTool();
   //some additional code
}
Ответ написан
Комментировать
@vanyamba-electronics
Такие переменные называются статическими переменными класса.
class SomeClass
{
public:
    static int m_objectsCounter;
    SomeClass() {
        ++m_objectsCounter;
    }
    virtual ~SomeClass() {
        --m_objectsCounter;
    }
};

И где-то в CPP-файле нужно будет объявить:
SomeClass::m_objectsCounter = 0;
Для доступа к статической переменной класса используется тот же синтаксис, что и для методов класса:
int main() 
{
    SomeClass x, y, z;
    std::cout << SomeClass::m_objectsCounter << std::endl;
    // можно и так:
    std::cout << y.m_objectsCounter << std::endl;
    return 0;
}

Статическими могут быть не только переменные класса, но и методы. Например:
class SomeClass
{
public:
     static int getSomethingGlobal() {
         return somethingGlobal;
     }
};

int main()
{
    std::cout << SomeClass::getSomethingGlobal() << std::endl;
    return 0;
}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы