Вернуть указатель на массив - PullRequest
0 голосов
/ 30 сентября 2011

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

class MyClass
{
   private:
      double *x;
   public:
      myClass();
      virtual ~MyClass();
      double* getX() const;
      void setX(double* input);
};

MyClass::MyClass()
{
   double foo[2];
   double * xInput;
   foo[0] = 1;
   foo[1] = 2;

   xInput = foo;
   setX(xInput);
}

void MyClass::setX(double * input)
{
   x = input;
}

double * MyClass::getX() const;
{
   return x;
}

int main()
{
   MyClass spam(); // Construct object
   double * bar = spam.getX(); // This doesn't work
}

В этом случае bar [0] и bar [1] равны jibberish: -9.2559631349317831e+061.

Ответы [ 3 ]

7 голосов
/ 30 сентября 2011
MyClass spam(); // Construct object

Это не создает объект, который объявляет функцию с именем spam, которая не принимает аргументов и возвращает MyClass.Это значение по умолчанию создает объект:

MyClass spam; // Construct object

Для получения дополнительной информации Google самый неприятный анализ .

Обновление: Как указал @Mark Ransomесть еще одна проблема с вашим кодом.В вашем конструкторе вы создаете массив, а затем устанавливаете x, чтобы указать на такой массив.Однако время жизни массива заканчивается, как только конструктор заканчивает выполнение, поэтому дальнейший доступ к x может привести к сбою (если вам повезет).

3 голосов
/ 30 сентября 2011

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

0 голосов
/ 30 сентября 2011

Вероятно, это должен быть * бар вместо бара [0].

...