Easyelectronics.ru

Электроника для всех
Текущее время: 19 окт 2019, 00:04

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/10pcs (Любой цвет!)
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 10 ] 
Автор Сообщение
 Заголовок сообщения: Видимость переменных класса...
СообщениеДобавлено: 29 июн 2019, 11:34 
Только пришел
Аватара пользователя

Зарегистрирован: 17 май 2014, 17:53
Сообщения: 20
Доброго дня!
Подскажите пожалуйста, почему я не могу обратиться к переменным класса из его же методов?
Среды разработки разные и под AVR Studio, IAR STM8....
Просмотрел кучу примеров и не нашел ни чего особенного для решения этого вопроса. Я только начинаю
осваивать С++
Спасибо!!

пример кода:
Код:
*** PCD8544.h ***
class PCD8544 {
  public:
      static void Set ( void );
  private:
      static uint8_t vCounter;
};

void PCD8544::Set ( void ) {
  vCounter = 55;
}

*** main.cpp ***
PCD8544 Display;

int main()
{
  Display.Set ( );
 
  while ( 1 ) {
   
  }
}

[/color]

Дает ошибку не определено PCD8544::vCounter


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Видимость переменных класса...
СообщениеДобавлено: 29 июн 2019, 12:05 
Старожил

Зарегистрирован: 10 июн 2011, 23:01
Сообщения: 3297
https://en.cppreference.com/w/cpp/language/static


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Видимость переменных класса...
СообщениеДобавлено: 29 июн 2019, 14:22 
Только пришел
Аватара пользователя

Зарегистрирован: 17 май 2014, 17:53
Сообщения: 20
Спасибо!!
Да! И так пробовал..
Код:
*** PCD8544.h ***
class PCD8544 {
  public:
      static void Set ( void );
  private:
      static uint8_t vCounter;
};

void PCD8544::Set ( void ) {
  PCD8544::vCounter = 55;
}

*** main.cpp ***
PCD8544 Display;

int main()
{
  Display.Set ( );
 
  while ( 1 ) {
   
  }
}


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Видимость переменных класса...
СообщениеДобавлено: 29 июн 2019, 19:12 
Старожил
Аватара пользователя

Зарегистрирован: 26 окт 2013, 07:58
Сообщения: 2349
Чудак человек!
Ты его задекларировал, а не создал!
В .cpp файле пиши - по идее должен называться PCD8544.cpp

Код:
uint8_t PCD8544::vCounter;



Можешь даже проинициализировать


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Видимость переменных класса...
СообщениеДобавлено: 29 июн 2019, 19:22 
Старожил
Аватара пользователя

Зарегистрирован: 26 окт 2013, 07:58
Сообщения: 2349
Теже решил плюсы изучать.

Моя первая прошивка на плюсах

http://www.youtube.com/watch?v=JYRZpaIoxI0


Чертовски удобно!
Хочу написать классы для работы с разной периферией.
Очень удобно будет использовать в различных проектах.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Видимость переменных класса...
СообщениеДобавлено: 29 июн 2019, 20:16 
Только пришел
Аватара пользователя

Зарегистрирован: 17 май 2014, 17:53
Сообщения: 20
В общем получается так:
Всегда создаю файлу ***.h, ***.cpp, просто в этот раз решил все вписать в один файл, AVR Studio так работало ( знаю, что
по фэншую, но когда что-то не получается, приходится многое пробовать и в результате на граблях учишься ).
Как обычно декларация в ***.h, а реализация ( методы в ***.cpp ), но раньше использовал глобальные переменные.
Все примеры которые я смотрел, а их было очень много ни когда не видел что бы переменные еще и создавать приходилось..
Спасибо за подсказку. Чисто интуитивно сделал запись, вроде не ругается...

Код:
*** PCD8544.cpp ***
#include "PCD8544.h"
#include "font5x7.h"

uint8_t PCD8544::Bufer [ 14 ] [ 6 ] [ 6 ];
uint8_t PCD8544::TextCursorX     = 0;
uint8_t PCD8544::TextCursorY     = 0;
uint16_t PCD8544::ETimeOut       = 0;
...
...
...

*** PCD8544.h ***
class PCD8544 {
    public:
      ...
      ...
      ...
    private:
      static uint8_t Bufer [ 14 ] [ 6 ] [ 6 ];
      static uint8_t TextCursorX;
      static uint8_t TextCursorY;
      static uint16_t ETimeOut;
      ...
      ...
      ...
};


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Видимость переменных класса...
СообщениеДобавлено: 29 июн 2019, 20:49 
Старожил
Аватара пользователя

Зарегистрирован: 26 окт 2013, 07:58
Сообщения: 2349
Вы её объявили как СТАТИЧЕСКУЮ, что означает, что она будет сущесвовать даже когда ни одного экзкмпляра класса не создано.
И она будет ОБЩЕЙ ДЛЯ ВСЕХ ЭКЗЕМПЛЯРОВ КЛАССА.
Как без создания то?


А когда не статическая - её конструктор класса сосдаст, не нужна реализация.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Видимость переменных класса...
СообщениеДобавлено: 29 июн 2019, 21:41 
Только пришел
Аватара пользователя

Зарегистрирован: 17 май 2014, 17:53
Сообщения: 20
Но зачем иметь класс без экземпляра?
Если переменную объявить как не статическую выдается сообщение:
a nonstatic member reference must be relative to a specific object C:\Project\STM\STM8\PCD8544\Src\PCD8544.c 77
И действительно переменные общие для всех экземпляров класса, да и логично ((


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Видимость переменных класса...
СообщениеДобавлено: 01 июл 2019, 09:51 
Старожил
Аватара пользователя

Зарегистрирован: 26 окт 2013, 07:58
Сообщения: 2349
Вы наверно удивитесь, но таки да - есть такие классы, для которых нельзя создать экземпляра, называются Виртуальными классами.
Зачем нужны - долго объяснять, почитайте соответствующую литературу.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Видимость переменных класса...
СообщениеДобавлено: 05 сен 2019, 11:53 
Заглядывает иногда

Зарегистрирован: 17 мар 2015, 16:18
Сообщения: 91
DenySemenov писал(а):
Доброго дня!
Подскажите пожалуйста, почему я не могу обратиться к переменным класса из его же методов?


Код:
*** main.cpp ***
#include <stdio.h>

class PCD8544
{
public:
   static void Set()
   {
      vCounter = 55;
   }
private:
   static int vCounter;
};

int PCD8544::vCounter;// статическую переменную надо объявлять отдельно
PCD8544 Display;

int main()
{
   Display.Set();
   printf("qwerty");
}

Смотрите. Предположим вы делаете симулятор автогонок. У вас есть класс "машины". У каждого экземпляра класса будет своя марка, своя мощность двигателя, свой цвет и т.д. Но. Ускорение свободного падения, плотность воздуха и другие параметры окружающей среды будут общими для всех машин. Эти данные можно поместить в класс "машины", тогда это будут статические переменные. Так же всевозможные расчеты на основе этих переменных будут статическими методами. Но. Что бы этим статическим методам было откуда черпать информацию, необходимо эти переменные явно насоздавать (да, это несколько странно и возможно, что статический функционал следует завернуть в отдельный класс). Делается это как показано выше. Можно - вверху *.cpp класса.

P.S. Настоятельно рекомендую попробовать гуглить на английском. Постарайтесь сначала построить/прочитать вопрос/ответ сами, а потом уже забить его в гугл-переводчик. И зарегистрируйтесь на StackOverflow (для программистов) и StackExchange (для электронщиков) - регистрация фактически одна на оба ресурса.
Сначала будет тяжеловато, но оно того стоит.
Во-вторых, многие вопросы новичков уже задавались (причем во множестве формулировок) и имеют хорошие, развернутые ответы.
А во-первых вы почувствуете разницу :) Зададите вопрос на отечественном сайте - вам через неделю расскажут какой же вы херовый долб**б, а по сути вопроса отправят в Гугл. Зададите вопрос на Стеке - вам за час поправят орфографию, вежливо ответят по сути и пожелают всех благ.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 10 ] 

Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB