I have to define a function in C++ that generates a vector of classes Foo and returns it.
I can define it in different ways, that are all quite equivalent:
C style parameter passing:
void generateFooVector(vector<Foo> * result)
{
for (int i = 0; i < 100; i++)
{
Foo f = Foo();
result->push_back(f);
}
}
int main()
{
vector<Foo> result;
generateFooVector(&result);
}
Reference passing passing:
void generateFooVector(vector<Foo> & result)
{
for (int i = 0; i < 100; i++)
{
Foo f = Foo();
result->push_back(f);
}
}
int main()
{
vector<Foo> result;
generateFooVector(result);
}
Instancing the vector and returning the pointer:
vector<Foo> * generateFooVector()
{
vector<Foo> * result = new vector<Foo>();
for (int i = 0; i < 100; i++)
{
Foo f = Foo();
result->push_back(f);
}
return result;
}
int main()
{
vector<Foo> * result = generateFooVector();
}
C style passing and instancing Foo class:
void generateFooVector(vector<Foo *> * result)
{
for (int i = 0; i < 100; i++)
{
Foo * f = new Foo();
result->push_back(f);
}
}
int main()
{
vector<Foo *> result;
generateFooVector(&result);
}
Reference passing + Foo instances:
void generateFooVector(vector<Foo *> & result)
{
for (int i = 0; i < 100; i++)
{
Foo * f = new Foo();
result->push_back(f);
}
}
int main()
{
vector<Foo *> result;
generateFooVector(result);
}
Vector instance + Foo instances:
vector<Foo*> * generateFooVector()
{
vector<Foo*> * result = new vector<Foo*>();
for (int i = 0; i < 100; i++)
{
Foo * f = new Foo();
result->push_back(f);
}
return result;
}
int main()
{
vector<Foo *> * result = generateFooVector();
}
Passing by value:
vector<Foo> generateFooVector()
{
vector<Foo> result;
for (int i = 0; i < 100; i++)
{
Foo f = Foo();
result->push_back(f);
}
return result;
}
int main()
{
vector<Foo > result = generateFooVector();
}
And maybe there are lots of other solutions.
All the current ways have different implications on how the memory is allocated, in the scope.
Maybe I've a lack of theory, but I'm really confused on how can I decide which is the better alternative for each use case, and why one is better than another. Can you help me?