LINUX.ORG.RU

C++ что значит префикс m в начале приватного члена класса?

 ,


0

2

Частенько, в примерах на C++, приватные члены класса начинаются префиксом m или m_. Понятно, что это удобно при использовании IDE, например, на предпросмотре увидеть приватные члены класса …

Но, как расшифровывается это m? Или просто взяли букву с потолка (private, hidden, invisible … ничего не подходит)?

P.S. например кутишники https://code.qt.io/cgit/qt/qtbase.git/tree/examples/corelib/serialization/savegame/game.h?h=5.15

ps2 хмм … masked?



Последнее исправление: cvprog (всего исправлений: 1)
Ответ на: комментарий от rumgot

У меня в башке базы от разных ЯП смешались. Так что не нуди. У него я спрашивал про плюсы. Причём, вот так как я спрашивал (как он описал), врядли есть будет.

deep-purple ★★★★★
()
Ответ на: комментарий от rumgot

Да я посмотрел историю твоих правок — разошёлся, блин, то добавит, это. Смотри, так и документацию напишешь ))

deep-purple ★★★★★
()
Ответ на: комментарий от rumgot

Никаких коллизий не будет

Коллизия - это не когда код не компилируется, а когда используется не та переменная. Программист не держит в голове все глобальные и локальные переменные так что по ошибке может использоваться не та переменная. Для глобальных переменных кстати тоже используется аналогичный подход: gVariable.

X512 ★★★★★
()
Ответ на: комментарий от X512

Так и же и пишу, если понимаешь механизм работы области видимости, не будет коллизий. Ключевая фраза здесь: если понимаешь. А если знаешь десять языков и при этом не знаешь толком ни одного, то тут уже не C++ виноват.

rumgot ★★★★★
()
Последнее исправление: rumgot (всего исправлений: 1)
Ответ на: комментарий от rumgot

Так и же и пишу, если понимаешь механизм работы области видимости

Вопрос не в понимании механизма области видимости, а в том что такой код трудно читать и писать. Вот вижу я var = otherVar, откуда мне знать что эти переменные локальные, поля класса или глобальные? Надо будет долго лазить по исходнику.

X512 ★★★★★
()
Последнее исправление: X512 (всего исправлений: 1)
Ответ на: комментарий от deep-purple

Так почему ж мы не пишем this->чтото ?

Длинно.

X512 ★★★★★
()
Ответ на: комментарий от X512

Стояночка. Не переобуваемся. Ты мне про чтение кода не пиши. Твой аргумент был в том, что мол коллизия и не та переменная будет использоваться. На что я тебе ответил, что при понимании коллизии не будет. Про чтение я и без тебя знаю.

rumgot ★★★★★
()
Ответ на: комментарий от X512

Для глобальных переменных кстати тоже используется аналогичный подход: gVariable.

И ещё я видел использование aVariable для обозначения аргументов.

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

Вот поэтому контекстная подсветка в IDE решает и экономит время. Там сразу будет понятно в случае с:

a = variable1
b = variable2
c = variable3
d = variable4

Где глобальная, где локальная переменная, где член класса и где аргумент.

В любом случае, использование префиксов a, m, g для имён я нахожу более логичным, чем использование _-извращения, мало того что визуально портящего код, так ещё и пересекающегося с какими-то запрещениями из стандарта, которые следует помнить.

EXL ★★★★★
()
Последнее исправление: EXL (всего исправлений: 1)
Ответ на: комментарий от deep-purple

Так поприбивали, что тут довольно часто проскакивают комментаторы вида «возьми ИДЕ, а не редактор, иначе в говнокоде не разберёшься».

Это вопрос экономии времени. В блокноте по типу vi или nano ты проект ковырять будешь гораздо дольше, чем открытый в какой-нибудь IDE с подсветкой, подсказками, автодополнением, фолдингом да ещё и всякими санитайзерами и статическими анализаторами наперевес.

И от качества кода проекта это зависит довольно слабо.

EXL ★★★★★
()
Последнее исправление: EXL (всего исправлений: 1)
Ответ на: комментарий от EXL

Вот поэтому контекстная подсветка в IDE решает

Во первых такие IDE не всегда под рукой, а во вторых не всегда удаётся настроить IDE под систему сборки конкретного проекта и в результате объявления находиться не будут.

X512 ★★★★★
()
Ответ на: комментарий от EXL

чем использование _-извращения, мало того что визуально портящего код, так ещё и пересекающегося с какими-то запрещениями из стандарта, которые следует помнить.

Да блин. Используй суффикс _, а не префикс.

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

rumgot ★★★★★
()
Ответ на: комментарий от X512

Вот поэтому среди программистов извечная дилемма: писать код опутывая его префиксами (дабы его было легче понимать из виндового блокнота) или же не использовать вообще никаких префиксов.

Собственно,

«В программировании существует лишь два характерных затруднения: инвалидация кеша, наименование сущностей и ошибка на единицу.»

Martin Fowler

EXL ★★★★★
()
Ответ на: комментарий от beastie

Берите пример

Почти в тему:

<?php

function f()
{
}

function F()
{
}
$ php test.php 
PHP Fatal error:  Cannot redeclare F() (previously declared in /home/deep/test.php:5) in /home/deep/test.php on line 9
Чо не смеётесь то? Это россия PHP!

А по делу: я пару-тройку крестовых проектов видел, где авторы не ленятся писать this->чтото и не придумывают всякие нестандартности в виде кастомных префиксов. А так по проектам всяким разброд и шатания по именованию.

deep-purple ★★★★★
()
Ответ на: комментарий от deep-purple

О! И оно реально сначала ищет в локале, затем в глобале и только потом у тхиса? (негде щас проверить)

На это можно вообще забить, на это есть предупреждения компилятора, если происходит «затенение», -Wshadow в gcc/clang

В MSVC тоже есть такое предупреждение, я просто сейчас номер не помню.

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

С++ очень безопасный язык программирования если знать как попросить компилятор быть убийцей раста по «безопасности»…

fsb4000 ★★★★★
()
Ответ на: комментарий от rumgot

Да блин. Используй суффикс _, а не префикс.

Это лишь частично сокращает проблему визуального мусора из висящих подчёркиваний, но не решает её.

EXL ★★★★★
()
Ответ на: комментарий от fsb4000

На это можно вообще забить

А вон там выше по треду никто не забивает, а только предлагают варианты которые им нравятся. Видишь. И ты ещё с флагами сборки пришёл ))

deep-purple ★★★★★
()
Ответ на: комментарий от EXL

или же не использовать вообще никаких префиксов

А что делать если имена по смыслу совпадают?

class Object
{
private:
	int fValue; // f - class field prefix

public:
	void SetValue(int value)
	{
		if (value != fValue) {
			PreSetValue();
			fValue = value;
			PostSetValue();
		}
	}
};
X512 ★★★★★
()
Ответ на: комментарий от deep-purple

не ленятся писать this->

Читаешь потом этот код и глаза болят. Эти ребята наверное из тех, кто любит писать some_namespace::some_function(). И растягивается в итоге простое выражение в километровую беговую дорожку.

rumgot ★★★★★
()
Ответ на: комментарий от rumgot

Но лучше конечно с постфиксами/префиксами.

Интересует мнение сторонников отсутствия префиксов.

X512 ★★★★★
()
Ответ на: комментарий от rumgot

Читаешь потом этот код и глаза болят

Фобия та же что и у EXL, только у него про «_»? Так вроде самый распространенный вариант «m» в префиксе. Норм?

из тех, кто любит писать some_namespace::some_function()

Так себе аргумент, но прикольный ))

километровую беговую дорожку

Бывает что аж конца строки не видно справа. Это я уже соплями называю. Вдогонку: уууу... как же меня бесят не соблюдение отступов и выравнивания и всякие пустые пробельные символы в конце строк. Не код, а лего-го какое-то!

deep-purple ★★★★★
()
Ответ на: комментарий от deep-purple

Так вроде самый распространенный вариант «m» в префиксе. Норм?

Я за суффикс _.

rumgot ★★★★★
()
Ответ на: комментарий от deep-purple

Я ещё придумывал такой вариант:

#define ThisIs(name) auto &name = *this

class Object
{
private:
	int value;

public:
	void SetValue(int value)
	{
		ThisIs(o);
		if (value != o.value) {
			o.value = value;
		}
	}
};

Только это слишком нестандартно и надо в каждой функции писать ThisIs.

X512 ★★★★★
()
Последнее исправление: X512 (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.