Перейти к содержанию
    

Плавный переход C -> C++ под МК

6 часов назад, Arlleex сказал:

В голову пример такой пришел. Есть панель с подсветкой, подсветка из отдельных управляемых RGB-светодиодов. Каждый диод описывается как

class Led {
  public:
    u8 red, green, blue;
  ...
};

Неудачный пример. Так как здесь все переменные - логически связаны, расположены рядом и поэтому - ничто не мешает заменить их массивом и проходить циклом по нему. Указатели на члены тут как раз не нужны. Такой пример - это довод как раз против использования указателей на члены.

Я же не зря уточнял:

18 часов назад, jcxz сказал:

если имеется много переменных-членов, которые сами по себе независимы (логически), но в какой-то момент их нужно обработать однотипно, все сразу.

18 часов назад, Forger сказал:

 самый "практический способ" выстрелить себе в ногу

И что же посоветует нам гуру "правильного" программирования для такого случая (когда нужно однотипно обработать несколько членов класса)? Как задать такой список? (члены логчически не связаны и расположены не рядом).

PS: Если что-то критикуешь, то нормальным вроде является предложить альтернативу?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

36 minutes ago, x893 said:

На другой стороне Луны есть инопланетяне ?

 

Spoiler

.thumb.jpg.249beba34c840190161b66d962620721.jpg

 

34 minutes ago, jcxz said:

Как задать такой список?

выше описано, дублирую: итератор (опционально) и соотв. метод/методы класса Led

поскольку в целях безопасности все поля класса должны быть исключительно private (реже protected), то доступ к ним должен быть возможен только через соотв методы этого класса или методов класса наследника (если поля protected)

попытка читать и тем более изменять поля класса тем, кому это не позволено, лишает вообще смысла уходить на плюсы. Тогда лучше оставаться на голых сях )

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 часа назад, juvf сказал:

Файл myTemplate.cpp

#include "myTemplate.h"

template <typename T> void f(T value)
{
// Общая реализация для всех типов
}

// Реализация явной специализации для типа `unsigned int`
template <>
void f<unsigned int>(unsigned int value) 
{
    printf("Hello unsigned int = %u");
}

 

А зачем тут нужна явной специализация? почему не сделать вместо явной специализации просто функцию не заморачиваясь шаблонами?

// Реализация явной специализации для типа `unsigned int`
void fUInt(unsigned int value) 
{
    printf("Hello unsigned int = %u");
}

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

19 минут назад, Forger сказал:

поскольку в целях безопасности все поля класса должны быть исключительно private (реже protected), то доступ к ним должен быть возможен только через соотв методы этого класса или методов класса наследника (если поля protected)

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

А что мешает использовать эти указатели только в методах класса? Я вроде не призывал использовать их за пределами методов класса.

Как то странно вы читаете...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 minutes ago, jcxz said:

А что мешает использовать эти указатели только в методах класса?

А какой смысл тогда вообще их там использовать, если и так есть прямой доступ к полям этого класса?  Или это задачка чисто академическая?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В 24.06.2024 в 17:27, Forger сказал:

поскольку в целях безопасности все поля класса должны быть исключительно private (реже protected), то доступ к ним должен быть возможен только через соотв методы этого класса

по мойму тут путаница тёплого с мягким. Задача про которую говорит  jcxz - обработать много данных класса за раз (когда нужно однотипно обработать несколько членов класса). При чем тут приват? У вас есть класс с членами приватными (или протект, или паблик - не важно) A1, A2, A3, ... ,An. У этого класса есть паблик метод calcData(). Вызываем этот метод и нужно в нем обработать однотипно свои приватные члены класса. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

5 minutes ago, jcxz said:

ну ка и я спрошу у него....

Spoiler

второе значение - кузнец, но первый вариант признаюсь по молодости чуть был, с кем не бывает, помогал друзьям студентам избегать прогулов ))

3 minutes ago, juvf said:

Задача про которую говорит  jcxz - обработать много данных класса за раз

если так, то тем более на кой бок тут нужны указатели?

разве что некий массив заполнить каким нить одинаковым значением, в цикле, но это делается как правило один раз в конструкторе, или вообще через memset

а явный цикл по массиву наоборот явно покажет что происходит, а указатель может только запутать

впрочем что происходит внутри класса, должно остаться внутри класса, и как это там реализуется не особо важно

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

5 минут назад, Forger сказал:

А какой смысл тогда вообще их там использовать, если и так есть прямой доступ к полям этого класса?  Или это задачка чисто академическая?

Я вроде написал в самом начале:
Если нужно однотипно (например - в цикле) обработать несколько логически не связанных и не смежных член-данных.

Второе применение: нужно сослаться на член из const-массива.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В 24.06.2024 в 17:40, razrab83 сказал:

А зачем тут нужна явной специализация? почему не сделать вместо явной специализации просто функцию не заморачиваясь шаблонами?

в отдельном взято случае, возможно просто функция без шаблона лучше/быстрее/понятнее/читаемо.... но, вы написали шаблон 

template <typename T> void f(T value) { // Общая реализация для всех типов }

потом его используете (и не толко вы, а все пользователи вашего кода

f<int>(a);

f<uint>(b);

есть некое API, и тут вас торкнуло для uint сделать немного по другому. Можно убрать шаблон для uint и сделать отдельную функци, тогда вы измените API и код, который уже написан и использует f<uint>(b); не будет собираться.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 minutes ago, jcxz said:

Второе применение: нужно сослаться на член из const-массива.

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

Я же понял задачу так, что нужен некий способ обращаться к полям класса СНАРУЖИ и аж через указатели 😬

15 minutes ago, jcxz said:

ну ка и я спрошу у него....

Quote

 

jcxz существует?

Да, jcxz существует. Это команда в x86 ассемблере.....

 

Так я и знал ...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

13 минут назад, Forger сказал:

на кой бок тут нужны указатели?

разве что некий массив заполнить каким нить одинаковым значением, в цикле, но это делается как правило один раз в конструкторе, или вообще через memset

Вы похоже и сами думать не хотите, и читать не желаете. Даже много раз повторенное:

10 минут назад, jcxz сказал:

обработать несколько логически не связанных и не смежных член-данных.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

15 minutes ago, jcxz said:

обработать несколько логически не связанных и не смежных член-данных.

можете привести КОНКРЕТНЫЙ пример, где указатель прям вот очень нужен и без него ничего путного не получается?

 

ps похоже хамство - это ваш стиль общения, стараюсь как многие не обращать внимания, хотя это и сложно

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

54 минуты назад, jcxz сказал:

Неудачный пример.

А в тыртырнете примерно такими примерами и кормят.

Вне зависимости от логической связанности данных внутри класса эти указатели позволяют не дублировать кучу кода.

Вроде мой пример вполне показывает минималистичный кейс, в котором +/- понятна идея этих указателей.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

15 минут назад, Forger сказал:

некий массив заполнить каким нить одинаковым значением

Начните уже думать наконец! Если есть члены класса: x1, x2, x3, x4, x5, x6, x7, x8, x9. Но цикл должен пройтись только по: x1, x3, x5, x9?
Как их объединить в массив?
А если часть этих членов - унаследована от родителя?
Как их объединить в массив?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 minutes ago, Arlleex said:

в котором +/- понятна идея этих указателей.

идея может и понятна, но какой в этом смысл? я честно не пойму, пример уж очень академический,

обычный цикл и/или переписанная структура/union куда нагляднее покажет в коде что в нем делается, наглядно и без оверхеда (если в этом проблема), компиляторы нынче умные, прекрасно поймут что от них хотят

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...