Странный вывод: почему этот код дает какой-либо значимый вывод, не говоря уже об этом?

0

Я не уверен, как даже изложить мой вопрос, но вот мы идем...

Итак, у меня есть этот класс, для которого operator[] имеет пустое тело (еще не реализовано). Тем не менее, когда я вызываю его из main(), он выводит результат. Что еще, результат - это то, что было назначено ему в предыдущей строке.

EDIT: Я добавил частный атрибут emptyValue, и я инициализировал его в TipVrijednosti() в конструкторе класса.

Вот пример:

  template<typename TipKljuca, typename TipVrijednosti>
    class BinStabloMapa : public Mapa<TipKljuca, TipVrijednosti>
    {
            .
            .
        TipVrijednosti &operator[] (const TipKljuca &kljuc) {
            return emptyValue;
        }
        const TipVrijednosti &operator[] (const TipKljuca &kljuc) const {
            return emptyValue;
        }
            .
            .
    }

    int main()
    {
        BinStabloMapa<int, int> m;
        m[100] = 200;
        cout << m[100] << endl;
        return 0;
    }

    OUTPUT: 200

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

  • 3
    Вы могли бы также использовать английский в своем фрагменте кода: P
  • 1
    Скорее всего, проблема сборки или проблема при создании вопроса из реального кода. @ P0W: Полностью не согласен, у вопросов должен быть реальный код, который терпит неудачу, я довольно устал от людей, массирующих код с целью задать и скрыть проблему в это время. Я бы взял реальный код на любом языке перед неправильным кодом на английском в любой день.
Показать ещё 4 комментария
Теги:
templates
operator-overloading
generic-programming
cout

3 ответа

8
Лучший ответ

У вас есть неопределенное поведение, потому что вы ничего не возвращаются из функции, которая имеет non- void тип возвращаемого значения.

§6.6.3:

Вытекание конца функции эквивалентно возврату без значения; это приводит к неопределенному поведению в возвращающей значение функции.

§1.3.24:

неопределенное поведение
поведение, для которого настоящий международный стандарт не предъявляет никаких требований

  • 0
    Итак, я добавил оператор return, и ничего не изменилось.
  • 2
    @IrfanKahvedzic Ну, что такое emptyValue ?
Показать ещё 3 комментария
2

Не такая большая головоломка. Ваш operator [] возвращает ссылку на некоторую переменную данных с именем emptyValue.

            m[100] = 200;

равносильно

            m.emptyValue = 200;

Затем вы пишете cout << m [100];

что похоже на

            cout << m.emptyValue;

Примечание: индекс "100" не имеет значения.

  • 0
    «Примечание: индекс« 100 »не имеет значения.» +1
0

Нет ничего с этим:

#include <iostream>
using namespace std;
template<typename TipKljuca, typename TipVrijednosti>
class BinStabloMapa /* : public Mapa<TipKljuca, TipVrijednosti> */ 
//comment inheritance to make it compile, not relevant to the problem
{
    //C++11 syntax, not relevant either
    TipVrijednosti emptyValue=TipVrijednosti();
    public:    
    TipVrijednosti &operator[] (const TipKljuca &kljuc) {
        return emptyValue;
    }
    const TipVrijednosti &operator[] (const TipKljuca &kljuc) const {
        return emptyValue;
    }


};

int main()
{
    BinStabloMapa<int, int> m;
    m[100] = 200; //calls no const operator[], thus emptyValue is changed 
    cout << m[100] << endl; //calls const operator[], thus emptyValue is return
    return 0;
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню