Область применения векторного содержимого C ++ std - PullRequest
2 голосов
/ 13 декабря 2011
class example1
{
    private:
    int i;
public:
    example1(){i = 1;}
    int getI(){return i;}
};

class example2
{
public:
    example2(){}
    vector<example2> this_vector_wont_compile(3);
    vector <example2> theVec;
    void addVec()
    {
        //what's the scope of this?
        //does push_back create a pointer
        //to which a deep copy of the example1 instance
        //returned by the constructor is performed?
        theVec.push_back(example2());
    }
};
int main()
{
    example2 theExample;
    theExample.theVec[0]; //can be accessed, instance of example1 in scope.
    return 0;
}

Привет, я пытаюсь понять основные операции с памятью при использовании std :: vectors. Приведенный выше пример показывает, как я использовал их в прошлом, не спрашивая, как это было сделано.

Конструктор example2 () возвращает экземпляр, который выходит из области видимости после завершения функции addVec (), так как же VEC добавляет его, сохраняя при этом в объеме до тех пор, пока значение Vec равно?

а также, почему объявление std :: vector как имеющего постоянный размер в классе приводит к ошибке компилятора, и как ее можно избежать?

Ответы [ 2 ]

3 голосов
/ 13 декабря 2011

Когда вы вызываете theVec.push_back(example2());, вектор создает копию временного экземпляра example2, который передается в push_back. Это будет сделано с помощью конструктора копирования класса, который компилятор автоматически сгенерирует, поскольку вы его явно не создали.

Я не совсем уверен, что вы спрашиваете об объявлении std::vector с постоянным размером. std::vector по определению не имеет постоянного размера. Однако вы можете создать его с начальным размером, определив ваш конструктор следующим образом:

class example2 
{
    example2() : theVec( 10 ) {};
    std::vector< example2 > theVec;
    ....
}
1 голос
/ 13 декабря 2011

Операция push_back в addVec копирует построенный объект во внутреннюю память. Оригинал выходит из области видимости и уничтожается.

Некомпилируемая часть не имеет смысла. Нет такой вещи как vector постоянного размера. Вот для чего std::array.

...