@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;

Как объявить их так, чтобы избежать подобных ошибок?
  • Вопрос задан
  • 127 просмотров
Решения вопроса 2
jcmvbkbc
@jcmvbkbc
http://dilbert.com/strip/1998-08-24
Как объявить их так, чтобы избежать подобных ошибок?

Очень странная конструкция в коде:
- если это такой уж 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;
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
Flyphant Москва
от 60 000 до 80 000 руб.
Агент Плюс Москва
от 200 000 руб.
IXORA Нижний Новгород
от 65 000 руб.
26 марта 2019, в 12:03
10000 руб./за проект
26 марта 2019, в 11:56
1 руб./за проект