Я изо всех сил пытаюсь понять термин статические средства и то, как он работает. здесь я инициализировал статическую переменную "float percent". и я должен преобразовать его в процент, используя convertToPercent(), и после его преобразования мне нужно принять значение и поместить значение в someMethod(), чтобы выполнить некоторые вычисления
ниже, что я имею
.час
class Foo {
private:
static float percentage;
public :
float convertToPercent();
};
.cpp
float Foo::convertToPercent() {
percentage = (30/100) * 100;
return percentage;
}
static float someMethod () {
//place the static percentage value here after doing convertToPercent() method to do some calculation;
}
однако он выдает мне сообщение об ошибке
Undefined symbols for architecture x86_64:
"Foo::percentage", referenced from:
Foo::convertToPercent() in Foo.o
Apperciate за помощь. благодаря
static
в этом контексте означает, что переменная percentage
не относится к определенному экземпляру класса Foo, она распределяется между всеми экземплярами Foo.
для того, чтобы линкер знал о переменной, которую вам нужно определить, а не просто объявлять, поэтому вы получаете сообщение об ошибке.
положил
float Foo::percentage = 0;
в файле.cpp
Вы должны определить статическую переменную вне класса.
// header file
class Foo {
private:
static float percentage;
};
// cpp file
float Foo::percentage(0.0);
Поскольку переменная-член является статической, будет только одно значение этой переменной, которое будет использоваться среди всех экземпляров классов Foo (все объекты Foo) в течение всего времени выполнения вашего процесса. Например. если у вас есть три объекта Foo A, B и C, то изменение процентного значения в объекте B также изменяет его и на объекты A и C.
Статический член разделяется между всеми объектами этого класса.
Статический член данных объявляется в объявлении класса и инициализируется в файле, содержащем методы класса. Оператор области используется в инициализации, чтобы указать, к какому классу принадлежит статический член. Однако, если статический член является интегральным типом const или типом перечисления, он может быть инициализирован в самом объявлении класса.
class Foo {
private:
static float percentage; // this is declaration not definition
public :
float convertToPercent();
};
Вам нужно определить percentage
в файле cpp:
float Foo::percentage(0.0); // initialize percentage to 0.0
§ 9.4.2 Элементы статических данных
Объявление статического члена данных в его определении класса не является определением и может иметь неполный тип, отличный от cv-qualoid void.
Вы только объявили его в классе, но не дали определения в cpp, который должен выглядеть следующим образом:
float Foo::percentage;
Ниже ваш код пытается объявить статическую процентную долю участника --- OKAY
// header file
class Foo
{
private:
static float percentage; //constant declaration
};
Ниже вашего кода пытается присвоить значение объекту (проценту), который еще не определен. -- НЕ ВСЕ В ПОРЯДКЕ
// cpp file
float Foo::convertToPercent() {
percentage = (30/100) * 100; //tring to update percentage which is not defined yet.
return percentage; //usage of object (percentage) which is not defined yet.
}
C++ требует, чтобы вы предоставили определение для всего, что используете, но константы, специфичные для класса, которые являются стандартными и являются интегральным типом. Пока вы не берете их адрес, вы можете объявить их и использовать их без предоставления определения.
В вашем случае ваш файл реализации (.cpp) должен иметь следующую строку, а затем вы можете использовать свою "процентную" константу, где это применимо.
float Foo::percentage(0.0); //definition of static class member : percentage