Нет ... если вы хотите получить ссылку на выходной объект, то передайте ссылку на указатель типа RELATION
в функцию, а не ссылку на объект типа RELATION
.
Например:
int getrelation(string name, RELATION*& output)
{
bool found=0;
int index=0;
for(int i=0;i<a_attributes.size();i++){
if(name==a_attributes[i].str_name){
found=1;
index=i;
}
}
if(!found){
printf("relation not found");
return 1;
}
output = &(a_attributes[index]); //take the address-of object
return 0;
}
Затем вы бы назвали свою функцию так:
RELATION* ptr_to_object = NULL;
string argument_name;
//...more code to initialize argument_name
if (getrelation(argument_name, ptr_to_object) == 1)
{
//...handle error condition
}
//now ptr_to_object points to your a_attribute[index] object
Итак, теперь вы можете разыменовать ptr_to_object
, и вы получите объект в a_attribute[index]
.Затем вы можете изменить атрибуты этого объекта путем разыменования указателя.Единственное предупреждение заключается в том, что вы не должны вызывать delete
на ptr_to_object
, поскольку он не «владеет» объектом, на который указывает объект, и возвращаемый указатель не указывает на начало сегмента памяти, выделенного с помощью new
.Кроме того, если контейнер a_attribute
избавляется от объекта (то есть, если это std::map
или std::vector
), тогда указатель будет указывать на недопустимое расположение в памяти.Таким образом, вы должны убедиться, что контейнер превосходит указатель, который вы используете в качестве ссылки на объект.