значение «нестатическая ссылка на член должна быть относительно определенного объекта» при попытке сослаться на массив внутри функции-члена

Я смущен тем, почему я не могу использовать arrValues, valuesBegin, а также valuesEndнесмотря на то, что моя функция-член публично определена в классе, который является предшественником ArrayValues.

У меня есть следующий код, который вызывает у меня проблемы:

      struct algorithms
{
    class arrayAlgs
    {
    public:
        int arrValues[100];
        int* valuesBegin = std::begin(arrValues);
        int* valuesEnd = std::end(arrValues);

        class ArrayValues
        {
        public:

            void createRandomArrayValues(){
            for(int& i: arrValues)
            {
                i = rand() % 100;
            }

        }
             void createAscendingArrayValues()
        {
                for(int* i = valuesBegin, d = 1;i <= valuesEnd; i++, d++)
            {
                *i = d;
            }
        }
        };
};
};

Следующий код представляет собой класс, в котором хранятся алгоритмы, но внутри него есть две функции-члена, которые создают среду для алгоритмов, которые будут использоваться внутри, однако этот результат не создается из-за ошибок, указывающих:

«Ссылка на нестатический элемент должна относиться к определенному объекту»

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

1 ответ

Что касается ошибки, ваш код более или менее похож на этот:

      struct algorithms { };

class arrayAlgs {
public:
    int arrValues[100];
    int* valuesBegin = std::begin(arrValues);
    int* valuesEnd = std::end(arrValues);
};

class ArrayValues {
public:
    void createRandomArrayValues(){
        for(int& i: arrValues) {
            i = rand() % 100;
        }
    }
    void createAscendingArrayValues() {
        for(int* i = valuesBegin, d = 1;i <= valuesEnd; i++, d++) {
            *i = d;
        }
    }
};

Тот факт, что вы определили классы, вложенные друг в друга, не означает, что вы можете волшебным образом получить доступ к членам экземпляра внешнего класса. Вам все еще нужен объект, чтобы получить доступ к его членам valuesBeginа также valuesEnd. Например, вы можете добавить arrayAlgsчлен ArrayValuesа затем получить доступ к его членам.

Однако весь ваш замысел, похоже, основан на недоразумении. Непонятно, почему вы все в своем коде помещаете в один класс:

      struct my_array {
    int arrValues[100];
    int* valuesBegin = std::begin(arrValues);
    int* valuesEnd = std::end(arrValues);

    void createRandomArrayValues(){
        for(int& i: arrValues) {
            i = rand() % 100;
        }  
    }
    void createAscendingArrayValues() {
        for(int* i = valuesBegin, d = 1;i <= valuesEnd; i++, d++) {
            *i = d;
        }
    }
};

Кроме того, для итерации от начала до конца вы должны использовать цикл for на основе диапазона:

       for (auto& e : arraValues) e = rand() % 100;
Другие вопросы по тегам