0

I have a problem about std::vector as member of class, I'm not clearly about the initialization mechanism

#include <iostream>
#include <vector>
using namespace std;

class Obj; //this is a Class object
class Grid
{
public:
	Grid(  ) { }
	~Grid(  ){ }
protected:
private:
    vector<Obj> v1; //initialization mechanism ? and specific requirement about Obj?
	vector<int>  v2; //does it need to be initialized in constructor function?
	//more difficult case
	vector<Obj*> v3;
};
4
Contributors
7
Replies
14
Views
8 Years
Discussion Span
Last Post by newcpp
0

No problems with v1 and v2: these members constructors create empty vectors. You can initialize them in Grid constructor(s) or later in the special member function (let it's named as init or what else), for example:

explicit Grid::Grid(size_t n): v2(n), v3(n) {}
// or
void Grid::initv2(const std::vector<int>& v) { v2 = v; }
void Grid::initv2(const int* a, size_t n)
{
    v2.clear();
    if (n > 0) {
        v2.resize(n);
        for (size_t i = 0; i < n; i++)
            v2[i] = a[i];
}

However you can't declare std::vector<Obj> v1 from incomplete Obj declaration class Obj; : template std::vector wants complete element type definition.

0

Firstly what do you mean by initialisation mechanism.

If you are trying to pre initialise your vector. The best way to do it is through a constructor.

Check this site out
http://www.cplusplus.com/reference/stl/vector/vector/

I just mean, in my case, v1, v2 should be initialized in the constructor function or not. and how vector<Obj> v3 is initialized, we suppose Obj is a defined object and has its own ctor function(constructor function).

0

>>I just mean, in my case, v1, v2 should be initialized in the constructor function or
>>no
Do don't need to construct vectors explicitly. When you define a vector a type T, the vector's constructor automatically calls the constructor of T for all the elements.
This poses a restriction that T should have at least one constructor.

0

No problems with v1 and v2: these members constructors create empty vectors. You can initialize them in Grid constructor(s) or later in the special member function (let it's named as init or what else), for example:

explicit Grid::Grid(size_t n): v2(n), v3(n) {}
// or
void Grid::initv2(const std::vector<int>& v) { v2 = v; }
void Grid::initv2(const int* a, size_t n)
{
    v2.clear();
    if (n > 0) {
        v2.resize(n);
        for (size_t i = 0; i < n; i++)
            v2[i] = a[i];
}

However you can't declare std::vector<Obj> v1 from incomplete Obj declaration class Obj; : template std::vector wants complete element type definition.

thx to ArkM, I now konw v1 v2 can be not initialized in the constructor function, that is to say, not necessary to do it. So I can add data in v1 or v2 directly in the later process, Do you think my understanding is right? by the way, class Obj is a defined class in my code, and it owns constructors.

0

More precisely: v1 and v2 are initialized if both are well constructed empty vectors. The class vector default constructor (constructor without parameters) constructs an empty vector.
The C++ Standard:

A constructor is used to initialize objects of its class type.

Yet another example:

void Grid::Grid(const vector<int>& vi): v2(vi) {}

There is so called ctor-initializer list in this Grid constructor: v2 member now is directly-initialized by the value of this constructor parameter. It's a preferred form of a member initialization if there is a proper non-default constructor of this member class.

0

Thank you for all your help, I think this gives me more understanding about object construction.

This question has already been answered. Start a new discussion instead.
Have something to contribute to this discussion? Please be thoughtful, detailed and courteous, and be sure to adhere to our posting rules.