LINUX.ORG.RU

Ответ на: комментарий от solovey

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

cvv ★★★★★
() автор топика

если так важно - можно вынести поле в отдельный класс, который его прикроет, и пронаследоваться от него

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

const не методу, а полю. Тогда поле можно будет изменить только в конструкторе и только в его списке инициализации.

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

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

очередной «странных желаний» тред, const в любом случае желательно расставлять

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

Именно эти варианты я и имею ввиду. const это не более чем защита от дурака

Reset ★★★★★
()

По идее это тянет на спецификатор в объявлении, но уже есть const и вы сами понимаете, что второго const с урезаным функционалом не будет. Завернуть в класс и раздать friend только для конструктора-деструктора? Ну или так, если цель — не писать const руками.

class Class
{
private:
    const struct PrevedKagDila
    {
        int a;
        int b;
    } c;
public:
    void foo()
    {
        c.a=45;
    }
};

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

Лишняя инструкция на запрос структуры. Структуру можно объявить и анонимную

class Class
{
private:
    const struct
    {
        int a;
        int b;
    } c;
public:
    void foo()
    {
        c.a=45;
    }
};

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

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

elfy
()

Народ, вопрос скорее всего возник изза неполного понимания const применительно к класам а не изза тяги к извращениям.

cvv ★★★★★
() автор топика

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

cvv ★★★★★
() автор топика

Посмотри в сторону mutable, например. Внимательно посмотри. Тебе это не нужно! а я точно не понял, что тебе нужно

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

Okay. Этош цплюсплюс. Курни чего-нибудь тяжелогоВыпей вина, закуси сыром, оберни поле в хитрую обертку, которая формально запретит изменение поля в методах :) Запряги компилер по хардкору: конопля-тайм проверками и донскими мета-вычислениями «а не из метода ли дергается поле? А ты уверен?» (Главное, не забудь комментарии: //u DO NOT WANT ass-ign diz memba anywer but ctor() bitchas! SRSLY - будет проще рефакторить) Потом через месяц почитаешь, что получилось - тут дао-то на голову и обрушится.

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

схороню твой пост, очень уж экспрессивный %)

Stil ★★★★★
()

Переходи на светлую сторону C#:

class Test
{
  private readonly int number;

  public Test()
  {
    number = 666;
  }

  public void Foo()
  {
    number++; // FAIL
  }
}

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

Что значит «вместо» конструктора?

class Class
{
public:
    Class() : something(42)
    {
    }
private:
    const int something;
};
Что в этом вас не устраивает?

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

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

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

А, в смысле, вы хотите инициализировать в списке инициализации, но не в теле конструктора? Я в упор не понимаю вашу проблематику и чем именно вам не угодил const.

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

на момент написания топика - я абсолютно забыл о списках инициализации что и породило вопрос: попытку эмуляции списка инициализации через конструктор

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