2014-06-04 4 views
1

У меня есть массив векторов в одном классе:Передача массива векторов в качестве параметра функции (значения не изменится)

class MeasurementData 
{ 
private: 
    std::vector<double> m_measuredStrengths[3]; 
} 

И я хотел бы функцию другого класса для изучения, что и передать обратно целое на основе анализа, например

int CStrengthAnalyser::GetBestFit(std::vector<double> measuredStrengths[3]) 
{ 
    int bestFit = -1; 
    // do stuff 
    return bestFit; 
} 

И я немного запутался лучшей практики для прохождения такого рода объекта вокруг, плюс настройки моей приемной функции не гарантирует никаких изменений в исходных данных.

Является ли моя функция декларацией ОК как есть, или мне нужно добавить некоторые рекомендации по лучшей практике?

+1

функция может изменить исходные данные, все, что захочет, потому что они берут указатель, а не копию массива. Возможно, вам нужен указатель на векторы 'const', или, лучше,' const std :: array , 3> & '. – chris

ответ

6

Функция у вас есть прямо сейчас та же функция, как:

int CStrengthAnalyser::GetBestFit(std::vector<double> * measuredStrengths) 

Таким образом, можно определенно изменить vector с. Если вы всегда имеете дело с массивом размером 3 вы можете взять const ссылку на массив размера 3.

int CStrengthAnalyser::GetBestFit(std::vector<double> const (&measuredStrengths)[3]) 

Или, если вы хотите, чтобы сделать его более универсальным:

struct CStrengthAnalyser 
{ 
    // ... 

    template<std::size_t N> 
    int GetBestFit(std::vector<double> const (&measuredStrengths)[N]) 
    { ... } 
}; 

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

Если вы хотите избежать уродливой ссылки на синтаксис массива, вы можете изменить определение MeasurementData, чтобы оно содержало std::array<std::vector<double>, 3> вместо простого массива C. Затем передать ссылку на это уборщик

int CStrengthAnalyser::GetBestFit(std::array<std::vector<double>, 3> const& measuredStrengths) 

И, наконец, вы можете также вывести размер std::array используя шаблон функции, как было показано ранее.

+0

Я бы предпочел передать const-ссылку на 'std :: array', чем эта вещь ... –

+0

@ T.C. Я тоже хотел бы, но это означает изменение определения «MeasurementData», и, возможно, это не вариант? Я расскажу об этом в ответ. – Praetorian

0

Я хотел бы предложить, что вы используете vector of vectors здесь, как

vector<vector<double> > your_measure(3); 

Когда вы передаете его в другую функцию, вы можете использовать ключевое слово const к нему, как

my_fun(vector<vector<double> > const & your_vec_vec); 
Смежные вопросы