значение «нестатическая ссылка на член должна быть относительно определенного объекта» при попытке сослаться на массив внутри функции-члена
Я смущен тем, почему я не могу использовать
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;