не могу понять термин «статический»

0

Я изо всех сил пытаюсь понять термин статические средства и то, как он работает. здесь я инициализировал статическую переменную "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 за помощь. благодаря

Теги:
c++11
visual-c++

5 ответов

4

static в этом контексте означает, что переменная percentage не относится к определенному экземпляру класса Foo, она распределяется между всеми экземплярами Foo.

для того, чтобы линкер знал о переменной, которую вам нужно определить, а не просто объявлять, поэтому вы получаете сообщение об ошибке.

положил

float Foo::percentage = 0;

в файле.cpp

  • 1
    Хорошо, спасибо большое. удалось заставить его работать уже
2

Вы должны определить статическую переменную вне класса.

// header file
class Foo     {
private:
    static float percentage;
};

// cpp file
float Foo::percentage(0.0);

Поскольку переменная-член является статической, будет только одно значение этой переменной, которое будет использоваться среди всех экземпляров классов Foo (все объекты Foo) в течение всего времени выполнения вашего процесса. Например. если у вас есть три объекта Foo A, B и C, то изменение процентного значения в объекте B также изменяет его и на объекты A и C.

  • 0
    Хорошо, спасибо большое. удалось заставить его работать уже
2

Статический член разделяется между всеми объектами этого класса.

Статический член данных объявляется в объявлении класса и инициализируется в файле, содержащем методы класса. Оператор области используется в инициализации, чтобы указать, к какому классу принадлежит статический член. Однако, если статический член является интегральным типом 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.

  • 1
    Хорошо, спасибо большое. удалось заставить его работать уже
  • 0
    @jeremykeh рад, что это помогло!
1

Вы только объявили его в классе, но не дали определения в cpp, который должен выглядеть следующим образом:

float Foo::percentage;
  • 0
    Хорошо, спасибо большое. удалось заставить его работать уже
0

Ниже ваш код пытается объявить статическую процентную долю участника --- 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
  • 0
    Спасибо за вашу помощь. Решите ее и поймите, что статично с помощью каждого, и вы

Ещё вопросы

Сообщество Overcoder
Наверх
Меню