Не постоянная функция членства, называемая в постоянной функции членства

#include 

class Hello {
public:
    void Test() {
        std::cout << "Testing" << std::endl;
    }
};

class Hi {
public:
    Hi()
    :hello(new Hello())
    {}

    ~Hi()
    {
        delete hello;
    }

    void Testing() const {
        hello->Test();
    }

private:
    Hello  * hello;
};

int main(int argc, char ** argv) {
    Hi hi; ;
    hi.Testing();
    return 0;
}

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

1
nl ja de
@Rapptz:: Теперь это собирает успешно.
добавлено автор Kenta, источник
Это определенно doesn' t собирают.
добавлено автор Rapptz, источник

3 ответы

Можно уменьшить проблему до следующей ситуации:

Foo x;

Foo       *       p1 = &x;
Foo       * const p2 = &x;

p1->non_const_method();    //OK
p2->non_const_method();    //OK

Foo const *       q1 = &x;
Foo const * const q2 = &x;

q1->non_const_method();    //error
q2->non_const_method();    //error

Постоянный ли ваш Привет - объект, только затрагивает верхний уровень константа модификатор на этой аналогии (т.е. ли Привет:: привет Привет * или Привет * константа ). Однако сначала модификатор константы являются неотъемлемой частью самого типа указателя (и незатронутый constness вашего объекта).

2
добавлено
@KerrekSB Несомненно, но какая часть моего редактировала делает вас, думают, было неправильным? Кроме того, в текущем пересмотре не ясно, что вы подразумеваете под "верхним уровнем" (как он wasn' t ясный, под чем вы подразумевали "первый" и "второй" в первом пересмотре).
добавлено автор Tamás Szelei, источник
@Learner: необходимо быть более точными с языком. Ваш Привет:: Привет Привет * , и в постоянном объекте это Привет * константа . Но тип указателя никогда Привет константа * .
добавлено автор Kerrek SB, источник
@fish: вы могли, пожалуйста, добавить ваш редактировать как комментарий вместо этого? I' m не совсем уверенный, было ли это улучшением...
добавлено автор Kerrek SB, источник
@Learner: Любой элемент данных объекта становится константу - готовился, когда сам объект константу . Это имеет смысл? Таким образом, если вы имеете структуру X {интервал a;}; X констант x; , затем x.a константа интервала .
добавлено автор Kerrek SB, источник
Но здесь мы не объявили Привет *константа привет внутри Привет класс тогда, как это может взять привет в качестве постоянного?
добавлено автор Kenta, источник
Я понял что-то от вашего поста.But одна вещь, которую я хочу знать, мы не объявили привет как постоянные (Привет *константа привет) внутри Привет класс, тогда как Тестирование функции членства возьмет его в качестве постоянного указателя. ИЛИ есть ли любое понятие C++ по этой теме, о которой я не знаю, так как я очень плохо знаком с ним.
добавлено автор Kenta, источник
@KerrekSB:: Спасибо. Теперь я получил его. каждый раз, когда мы объявляем некоторую функцию членства столь же постоянной, все участники, присутствующие в том объеме функции, будут взяты как постоянные. Как вот привет постоянный указатель. таким образом, если мы сделаем что-то как привет = новый Привет() в Тестировании (), тогда оно даст одну ошибку (так как мы изменяем адрес). Но здесь мы пытаемся получить доступ к тому, что привет указывает на (который является Тестом ()), Таким образом, не показ любой ошибки. Мое понимание правильно? Пожалуйста, исправьте, если я неправ.
добавлено автор Kenta, источник

В Привет:: Проверяя , привет объект "является константой". Что означает, что указатель привет не может быть изменен в том методе. (Это - как будто привет был определен как Привет * константа привет; на время того метода.)

Но это не означает, что привет преобразовывается в указатель на константу (который был бы похож Привет на константу * константа привет; ). Объект, на который указывает привет , не является константой, таким образом, можно призвать ее методы неконстанты без ограничения.

2
добавлено
Но это не означает, привет постоянный объект. Но я читал как, мы наклоняем требование не постоянная функция членства через постоянный объект. Тогда в этом случае это нарушает право понятия?
добавлено автор Kenta, источник
все участники действуют, как будто им добавили константу верхнего уровня. Это означает, что участники указателя становятся указателями константы. Можно ли, пожалуйста, объяснить эту линию, указанную вами немного больше?
добавлено автор Kenta, источник
Я понял что-то от вашего поста.But одна вещь, которую я хочу знать, мы не объявили привет как постоянные (Привет *константа привет) внутри Привет класс, тогда как Тестирование функции членства возьмет его в качестве постоянного указателя. ИЛИ есть ли любое понятие C++ по этой теме, о которой я не знаю, так как я очень плохо знаком с ним.
добавлено автор Kenta, источник
:: Спасибо. Теперь я получил его. каждый раз, когда мы объявляем некоторую функцию членства столь же постоянной, все участники, присутствующие в том объеме функции, будут взяты как постоянные. Как вот привет постоянный указатель. таким образом, если мы сделаем что-то как привет = новый Привет() в Тестировании (), тогда оно даст одну ошибку (так как мы изменяем адрес). Но здесь мы пытаемся получить доступ к тому, что привет указывает на (который является Тестом ()), Таким образом, не показ любой ошибки. Мое понимание правильно? Пожалуйста, исправьте, если я неправ.
добавлено автор Kenta, источник
Нет, это doesn' t. это "является константой" в том методе и всем членском выступлении, как будто им добавили константу верхнего уровня. Это означает, что участники указателя становятся указателями константы. Т.е. вы couldn' t действительно привет = новый Привет; в том методе. That' s вся эта константа дает вам все же. Это doesn' t делают все объекты указанными членской константой указателей.
добавлено автор Mat, источник
Да, указатели константы. Не указатели на объекты константы (или указатели константы на объекты константы). Вещью, которая "становится константой", является указатель, не объект, на который указывает указатель. (Другими словами, привет-> foo() не изменяет указатель привет , это только читает его, и затем называет метод на объекте, который привет указывает на. Тот объект "не стал константой"),
добавлено автор Mat, источник
константа вы вставляете это function' s подпись ( пустота, Проверяющая() константа ), то, что заставляет компилятор обработать весь код в той функции как будто , там была константа верхнего уровня, добавил ко всем членам Привет . That' s то, что говорит стандарт C++, должно быть сделано для квалифицированных константой функций членства.
добавлено автор Mat, источник

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

Указатель константы на (нормальный) объект просто означает, что вы не можете изменить сам указатель. Так как это - все еще указатель на обычный объект, можно использовать любую функцию членства, не только функции членства константы. Если у целевого объекта будут константа и нормальные перегрузки той функции, нормальная перегрузка будет выбрана.

Когда у вас есть указатель как у члена объекта константы, вы получаете второе, не первое.

1
добавлено
pro.cxx
pro.cxx
3 049 участник(ов)

C/C++ chat 0. Простые вопросы, лабы и о IDE — в чат новичков @supapro 1. Не хамим, не переходим на личности, не вбрасываем утверждения без доказательств 2. No Ads, offtop, flood Объявления о вакансиях и евенты - в лс @AlexFails https://t.me/ProCxx/259155

supapro.cxx
supapro.cxx
1 925 участник(ов)

Чат для тех, кто немного знает C++, простые вопросы по реализации, синтаксису и ide – сюда, а для другого есть: /Главный чат по серьезным вопросам — @ProCxx /Чат по обсуждению всего — @fludpac

C++ Russia
C++ Russia
384 участник(ов)

Сообщество разработчиков C++ в Telegram.

cxx.Дискуссионная
cxx.Дискуссионная
298 участник(ов)

это не двач, общайтесь вежливо; разговор на почти любые темы; Не согласны с баном? В лс @AlexFails, @ivario

C++ для маленьких и тупых
C++ для маленьких и тупых
105 участник(ов)

Лоу левел (по среднему IQ участников) чатик ExtremeCode @extremecode Флудилка @extremecode_rest