Nano Hash - криптовалюты, майнинг, программирование

Вызов перегруженного оператора С++ [] после использования динамического создания экземпляра содержащего класса, похоже, не работает

Я новичок в C++ и имею опыт работы с Java и C#. Я только что написал код, чтобы немного познакомиться с исключениями в C++:

#include<iostream>
#include<string>
using namespace std;


class MyException
{
public:
    MyException(string message)
    {
        this->message = message;
    }

    string& getMessage()
    {
        return this->message;
    }

private:
    string message;
};


class MyClass
{
public:
    MyClass()
    {
        v = new string[2];
        v[0] = "wdeed";
        v[1] = "yyyyyyy";
    }
    ~MyClass()
    {
        delete[] v;
    }
    string& operator[](int index)
    {
        if (index < 0 || index > 1)
            throw MyException("index out of bound exception");

        return v[index];
    }
private:
    string *v;
};


int main()
{
    int index;

    //first option below is not working
    MyClass *myClass = new MyClass();

    //second option works:
    //MyClass myClass;


    cin >> index;
    cout << endl;

    try
    {
        cout << myClass[index];//this is where the error appears
    }
    catch (MyException& ex)
    {
        cout << ex.getMessage();
    }
    catch (...)
    {
        cout << "Other exception";
    }

    return 0;
}

Оператор «cout ‹‹ myClass[index];» выдает ошибки

Ошибки, которые я получаю только при использовании динамического распределения (MyClass *myClass = new MyClass();):

  1. no operator "<<" matches these operands operand types are:std::ostream<

  2. binary '<<': no operator found which takes a right-hand operand of type 'MyClass' (or there is no acceptable conversion)

Как я могу исправить код?


  • Указатели в C++ никогда не разыменовываются автоматически, в отличие от Java и C#. 22.01.2016

Ответы:


1

MyClass *myClass — это указатель на объект MyClass. Таким образом, вам нужно разыменовать его, прежде чем использовать его как MyClass:

(*myClass)[index];

Но на самом деле вам вообще не нужно использовать new здесь. myClass должен быть просто автоматическим объектом (как ваш закомментированный код), а внутренний динамический массив std::string вместо этого должен быть std::vector<std::string>.

22.01.2016
  • Спасибо за ответ. Но почему следующий фрагмент не генерирует ошибок?: string *v = new string[2]; v[0] = мы; cout ‹‹ v[0]; Это похоже на проблему, с которой я столкнулся, учитывая тот факт, что и myClass, и v хранят адреса памяти кучи. 22.01.2016
  • @Andrei: В этом коде v[0] имеет тип string, для которого оператор извлечения (operator<<) был перегружен. В исходном коде у вас есть myClass[index] типа MyClass, для которого оператор извлечения не был перегружен. Обратите внимание, что вы получаете сообщение об ошибке operator<<, а не operator[]. Поскольку myClass[index] по-прежнему является допустимой операцией, она просто не вызывает написанную вами функцию, а просто выполняет простую индексацию указателя. 22.01.2016
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

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

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..