Я смущен тем, как получить несколько массивов с плавающей точкой из класса с использованием возвращаемых параметров. Вот упрощенный пример.Как правильно вернуть массив элементов класса в качестве возвращаемого параметра
class Points
{
private:
float *x;
float *y;
float *z;
public:
void getCoordinates (float *retx, float *rety, float *retz);
}
void Points:: getCoordinates (float *retx, float *rety, float *retz)
{
retx=x;
rety=y;
retz=z;
}
Когда я выполняю назначение внутри функции, значения указателя совпадают. Однако значения меняются, как только я покидаю функцию. Ограничен ли объем указателя?
Основано на How to properly return an array (class member) in C++?, я не думаю, что так должно быть. Дискуссия предполагает, что не только можно передать указатель, но что изменения в памяти с помощью указателя будут влиять на исходный экземпляр класса. Точно как я ожидаю, что указатели будут работать.
Одна работа вокруг, что я пытался это использовать тетсру
void Points::getCoordinates (float *retx, float *rety, float *retz)
{
memcpy(retx, x, sizeof(float)*numPoints);
memcpy(rety, y, sizeof(float)*numPoints);
memcpy(retz, z, sizeof(float)*numPoints);
}
Это работает так, как я хочу его тоже. Недостатком этого подхода является то, что мне нужно выделить правильный объем памяти в вызывающей функции, и я использую больше памяти, чем мне кажется.
вам необходимо передать входные аргументы либо в виде двойных указателей, либо в качестве ссылки на указатель (т. Е. Вам нужно передать их по ссылке). – 101010
Класс 'Points', который хранит несколько массивов для значений x, y и z, звучит как [плохая идея] (http://msmvps.com/blogs/jon_skeet/archive/2014/06/03/anti-pattern-parallel -collections.aspx). Почему бы не использовать 'std :: vector' вместо этого, где 'Point' имеет одно значение x, y и z? –
fredoverflow
@FredOverflow Я на самом деле не писал класс «Points». Казалось, это самый простой пример. :) – Cecilia