Пусть говорят, что моя функция имела массив, переданный в нем следующим образом:
int someFunction ( SomeClass * const * array, int arr_size ) { }
Это массив некоторых структур:
struct SomeStruct {
int value;
int value2;
};
То, что я пытаюсь достичь, - это сделать ссылку внутри объекта, объявленного в этой функции:
int someFunction ( SomeStruct * const * array, int arr_size )
{
NewClass newclass (array, arr_size);
}
мой конструктор будет выглядеть так:
Newclass::NewClass( SomeStruct * const * array, int arr_size )
{
SomeStruct ** myReference = new SomeStruct * [arr_size];
for (int i = 0; i < arr_size; ++i)
{
myReference[i] = array[i];
}
myReference[0] -> value = 10;
}
Теперь, если я хочу распечатать значение первого элемента в массиве, я получаю только нуль.
int someFunction ( SomeStruct * const * array, int arr_size )
{
NewClass newclass (array, arr_size);
cout << array[0] -> value << endl;
}
Вывод:
0
Можно ли даже ссылаться на не-объект из класса? Как получить массив ссылок для изменения исходного массива? У меня был массив ссылок в этой функции как не объект раньше, и все работало нормально. И нет, я не могу просто оставить его там.
Когда вы выделяете указатели на структуру в Newclass::NewClass()
, вы забываете фактически инициализировать эти указатели, Newclass::NewClass()
на фактические структуры.
Тебе нужно:
Newclass::NewClass(SomeStruct* const* array, int arr_size)
{
SomeStruct** myReference = new SomeStruct*[arr_size];
for (int i = 0; i < arr_size; ++i) {
myReference[i] = array[i];
}
myReference[0]->value = 10;
}
Хотя я должен сказать, что я запутался во всей косвенности указателя и почему он вам нужен. И вы тоже теряете память; вы никогда не delete[] myReference
.
И вы должны использовать std::vector
вместо того, чтобы делать все это управление памятью вручную.
myReference[i] = &array[i];
невозможно из-за преобразования из const в не-const. Вне класса это работает даже без &
.
myReference
соответствующим образом. Ответ на самом деле показывает реальную проблему, с которой вы столкнулись.