2014-10-01 6 views
0

это мой второй основной вопрос по указателям. Я вызываю функцию, выставленную в DLL.получение указателя на вектор C++

Вектор объявляется и заполняется значениями внутри вызываемой функции.

Мне нужно пройти через вектор и получить доступ к его значениям из вызывающей функции.

int calling_function() 
{ 
int* vectorSize; 
string input = "someValue"; 
vector<customObjects> *v;// do i need a pointer to a vector here? 

void function_being_called(input,v,&vectorSize); 

//need to access the vector here... 

} 

void function_being_called(string input, void *returnValue, int* vectorSize) 
{ 
vector<customObjects> v; 
v.push_back(myObj); 

*vectorSize= v.size(); 

*returnValue = ? // how to pass vector to the calling function through this parameter pointer variable 

return; 
} 
+0

указатель vectorSize неинициализирован. Также это не нужно. –

+1

Yuck. «Int» для vectorSize ?! Используйте 'std :: size_t' (некоторые люди даже нахмурились, говоря, что вы должны использовать' std :: vector <> :: size_type', поскольку стандарт не указывает, что должен быть таким же, как 'std :: size_t') , лучше все равно это. – Bathsheba

ответ

1

У вас есть два варианта. Во-первых, передать вектор в качестве ссылки:

string input = "someValue"; 
vector<customObjects> v; 
function_being_called(input, v); 

void function_being_called(string input, vector<customObjects> &v) 
{ 
// Whatever 
} 

Или, если вы используете C++ 11 просто возвращают vector и пусть конструктор шаг заботиться о нем:

string input = "someValue"; 
vector<customObjects> v = function_being_called(input); 

vector<customObjects> function_being_called(string input) 
{ 
    vector<customObjects> v; 

// Whatever 

    return v; 
} 
+0

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

2

Это должно быть так:

int calling_function() 
{ 
    string input = "someValue"; 
    vector<customObjects> v; 

    function_being_called(input,&v); 

    // access the vector here... 

} 

void function_being_called(string input, vector<customObjects>* v) 
{ 
    v->push_back(myObj); 
} 
+0

Почему указатель на вектор вместо ссылки? –

+1

Я предпочитаю этот стиль, поскольку он сигнализирует вызывающему, что вектор может быть изменен. Но очень лично я знаю. – Bathsheba

+1

@JoachimPileborg: лично я обычно предпочитаю указатели на параметры, потому что это более понятно. К сожалению, C++ не имеет встроенного способа сказать '[out]', как это делают некоторые языки. Да, вы могли бы передать nullptr, но, ну, я все еще нахожу сайты вызовов намного более очевидными. Конечно, дело вкуса. Некоторые правила кодирования требуют этого - я думаю, включая Google. –

Смежные вопросы