LINUX.ORG.RU

Почему в константном методе невозможно вернуть указатель?

 , ,


0

2

Имеется следующий старенький код, в котором необходимо метод getTableData() сделать константным:

class TreeItem
{
 public:

    // Взятие ссылки на данные конечных записей
    RecordTableData *getTableData(void) const;
 
 private:
     RecordTableData recordsTable;
}

...

RecordTableData *TreeItem::getTableData(void) const
{
  return &recordsTable;
}

Насколько я понимаю, модификатор метода const должен следить за тем, чтобы в методе не происходило изменения объекта класса. И никакого изменения не происходит: берется адрес мембера и возвращается как указатель. Все. Что там будет происходить с переданными данными - будут они меняться по указателю, не будут - это не забота метода getTableData(). Он данные не изменил, а значит метод константный.

Но компилятор почему-то показывает ошибку:
TreeItem.cpp:632:10: error: binding reference of type 'RecordTableData' to value of type 'const RecordTableData' drops 'const' qualifier

Вопрос: как заставить компилироваться этот код, в котором метод должен быть помечен как константный? Если модификатор const убрать, то эта ошибка исчезает. Но мне нужно, чтобы данный метод был константный, потому что он используется в другом константном методе.

★★★★★

Последнее исправление: Xintrea (всего исправлений: 2)
Ответ на: комментарий от cobold

Однако такое принуждение к задуманной автором семантике класса ужасно мешает при попытке переиспользовать его класс в другом коде

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

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

imatveev13
()
Ответ на: комментарий от alysnix

Складывается впечатление что вы считаете ограничения добром по умолчанию.

конечно. как и решетка на сливе в канализацию.

Код как слив в канализацию. Хорошая аналогия.

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

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

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

а у других этого может и не быть. вот для них и изобрели всякие квалификаторы. и решетки на канализации.

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

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

Кажется у авторов CppCoreGuidelines опыт сходный с моим. И они вас просят: не пишите свой код так чтобы заглянув в него было ощущение что попал в канализацию. Тогда не понадобятся маниакальные попытки кого то в свой код не пускать квалификатороми и решетками. И главная проблема чтения чужого кода - лишний код кот. ничего полезного не делает.

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

И главная проблема чтения чужого кода - лишний код кот. ничего полезного не делает.

я уж сказал, что авторы с++ позаботились и о вас. и потому сделали struct с публичными по дефолту полями. вот в struct писать сеттеры и геттеры - моветон. а в классе - нормальная практика.

одна из идей плюсов - дать методы описания максимально «прочных классов». то есть таких сущностей, которые невозможно взломать или привести в неконсистентное состояние снаружи. чтобы всегда сохранялись некие инварианты данного класса. для этого и вводятся спецификаторы, а также рекомендуются сеттеры/геттеры.

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

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

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

Что вы вообще понимаете под формализацией опыта?

Очевидно, формальное объяснение причин появления именно такого опыта. Иначе у нас чувственное познание (интуиция, опыт), не переходит в рациональное и мы имеем дело с суевериями.

Очень даже расскажем.Весь интернет завален примерами.

Да уж ладно, прямо-таки завален. Но в любом случае, примерами ничего нельзя доказать.

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

Очевидно, формальное объяснение причин появления именно такого опыта.

Первый закон Ньютона сможете формально объяснить? Вот он: Всякое тело продолжает удерживаться в своём состоянии покоя или равномерного и прямолинейного движения, пока и поскольку оно не понуждается приложенными силами изменить это состояние.

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

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

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

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

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

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

Как вы об этом узнали?

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

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

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

А это

поскольку оно не понуждается приложенными силами изменить это состояние

и есть формальное объяснение. Правда, нужно будет ввести дополнительные абстракции, без которых оно бессмысленно (определение «силы»; там и гравитацию придётся «подтянуть» — иначе почему тело будет скатываться вниз, ведь его никто не толкает?)

Всякое тело продолжает удерживаться в своём состоянии покоя или равномерного и прямолинейного движения

А это — эмпирический опыт. Это наблюдение, которое само по себе ничего не значит и ничего не объясняет.

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

поскольку оно не понуждается приложенными силами изменить это состояние

и есть формальное объяснение. Правда, нужно будет ввести дополнительные абстракции, без которых оно бессмысленно (определение «силы»; там и гравитацию придётся «подтянуть» — иначе почему тело будет скатываться вниз, ведь его никто не толкает?)

А чем объясняется что без понуждения не изменится состояние?

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

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

принцип Гамильтона естессно. я это в институте изучал, по предмету теорфизика.

ищите в вики - Принцип наименьшего действия

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

А чем объясняется что без понуждения не изменится состояние?

Это формально и в деталях объясняется в школьном учебнике физики.

Возвращаясь к. А посылка «нельзя использовать тривиальные сеттеры» таким же образом чем-нибудь подкреплена, или это всё-таки чистая эмпирика, то бишь суеверия?

anonymous
()
Ответ на: комментарий от alysnix

В статье написано: Ещё античные натурфилософы (например, Аристотель) предполагали, что «природа ничего не делает напрасно и во всех своих проявлениях избирает кратчайший или легчайший путь»

Вы понимаете как эта абстрактная идея пришла в голову Аристотелю? На основании какой информации?

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

Вы понимаете как эта абстрактная идея пришла в голову Аристотелю? На основании какой информации?

это не имеет отношения к классам в плюсах. но отвечу - для аристотеля это был чисто философский вывод. потому, что если между состояниями А и Б есть переход, то он будет осуществляться или самым простым или самым сложным образом(если таковой имеется).

потому что такой переход должен быть ВСЕГДА ОДИНАКОВЫМ, при равных условиях, вне зависимости от времени. потому что законы природы не должны зависеть от времени их применения(типа утром одни, вечером другие). а если переход будет осуществляться все время разными путями - не будет стационарности во времени.

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

карочи принцип гамильтона - это чисто аксиоматический принцип. «потому что иначе быть не может». :)

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

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

это не имеет отношения к классам в плюсах.

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

потому что такой переход должен быть ВСЕГДА ОДИНАКОВЫМ, при равных условиях, вне зависимости от времени

Это аксиоматика введенная людьми. Но откуда взялась идея что такая аксиоматика имеет смысл?

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

Это аксиоматика введенная людьми. Но откуда взялась идея что такая аксиоматика имеет смысл?

уже написал. но вкраце - если законы природы существуют, то они стационарны во времени(провал в черную дыру не предлагать). а если они стационарны во времени, то принцип гамильтона вознкает автоматически. это просто следствие.

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

бросить вам на голову кирпич с высоты третьего этажа например. можно несколько раз

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

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

Поставить эксперимент. Верно. Обязательно несколько раз, воспроизводимость обязательна для эксперимента.

Воспроизводимость диктует стационарность. «Законы природы» стационарны, потому что нужна воспроизводимость. Научный метод не признает, не изучает единичные события. Так и живем без магии.

anonymous
()
Ответ на: комментарий от imatveev13

Из обобщения эмпирических данных берутся абстракции

это к прочным классам имеет отношение или просто - поболтать?

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

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

это к прочным классам имеет отношение или просто - поболтать?

Имеет. Как сделать абстракцию прочной?

Абстракцией чего является ваш класс?

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

Имеет. Как сделать абстракцию прочной?

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

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

Абстракцией чего является ваш класс?

абстракцией «обьекта» в философском понимании этого слова. абстракцией части «сущего», в еще более философском понимании.

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

Как сделать абстракцию прочной?

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

Т.е. даже если ваша абстракция не отражает реального мира, вы просто запретите ее менять и готово?

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

Т.е. даже если ваша абстракция не отражает реального мира, вы просто запретите ее менять и готово?

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

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

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

А почему вы считаете что только вы знаете какие случаи подходящие? Вы запрещаете переиспользовать ваш код? И не являются ли геттеры/сеттеры костылями для выражения вашего понимания? Ведь геттеры/сеттеры ничего не объясняют, только ограничивают и замусоривают код, кот. все равно придется читать когда абстракция протечет.

imatveev13
()
Ответ на: комментарий от alysnix

может там вообще нужна другая абстракция?

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

imatveev13
()
Ответ на: комментарий от alysnix

Абстракцией чего является ваш класс?

абстракцией «обьекта» в философском понимании этого слова. абстракцией части «сущего», в еще более философском понимании.

Предлагаю уточнить примерами в духе:

Класс окна - абстракция области экрана в кот. можно рисовать и методы для работы.

Драйвер - абстракция аппаратного уст-рва и методы..

Из таких эмприреческих примеров мы сможем обобщить абстракция нашей абстракции - класс.

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

А почему вы считаете что только вы знаете какие случаи подходящие?

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

вы же хотите переделать мопед в мотоблок. а чотакова! мотор есть, колеса есть, плюс золотые ручки мастера.

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

вы же хотите переделать мопед в мотоблок.

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

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

imatveev13
()