Проблема при добавлении элемента в вектор.
От: Dmitry3  
Дата: 03.08.06 06:43
Оценка:
Добрый день!
Вы не сталкивались с такой проблемой:

имеются два класса:

class A
{
....
};
class B
{
.....
public:
A* a;
.....
B(const B& b)
{
....
a = b.a; // мне необходимо чтобы объект указывал на ту же память.
....
}
};

std::vector<B> vtrB;

A* ptrA = new A;
B myB;
myB.a = ptrA;

vtrB.push_back(myB);

при добавлении нового элемента в пустой вектор при помощи push_back() элемент не добавляется! т.е. vtrB.size() == 0!!!

В чем же дело?
Re: Проблема при добавлении элемента в вектор.
От: Аноним  
Дата: 03.08.06 07:12
Оценка:
Здравствуйте, Dmitry3, Вы писали:

D>В чем же дело?


А reserve и resize пашут?
Re: Проблема при добавлении элемента в вектор.
От: _Dreamer Россия  
Дата: 03.08.06 07:19
Оценка:
Здравствуйте, Dmitry3, Вы писали:

D>Добрый день!

D>Вы не сталкивались с такой проблемой:

D>имеются два класса:

D>при добавлении нового элемента в пустой вектор при помощи push_back() элемент не добавляется! т.е. vtrB.size() == 0!!!
D>В чем же дело?

странно. у Вас какая STL ?
ну во первых, попробуйте отладчиком пройти по шагам внутри push_back().
если непонятно, почему не происходит добавление элемента, попробуйте так —

B myB;
std::vector< B > vtrB( 1 );
//здесь проверить vtrB.size()
vtrB[0] = myB;


если всетаки не прояснится, выложите минимальный пример, воспроизводящий проблему.
Re: Проблема при добавлении элемента в вектор.
От: Sundor  
Дата: 03.08.06 08:32
Оценка: +1
Только что попробовал ваш пример (вот в таком вот виде):

#include <vector>
#include <iostream>

using namespace std;

class A
{
public:
    A() { x=0; };

    int x;
};

class B
{

public:
    A* a;
    
    B() { a = NULL; };

    B(const B& b)
    {
        a = b.a; // мне необходимо чтобы объект указывал на ту же память.
    }
};

int main()
{
    std::vector<B> vtrB;
    
    A* ptrA = new A;
    B myB;
    myB.a = ptrA;
    
    vtrB.push_back(myB);

    cout << vtrB.size() << endl;
    
    return 0;
};

На выходе 1. Так что проверяйте свою программу...
Re: Проблема при добавлении элемента в вектор.
От: Константин Л.  
Дата: 03.08.06 11:17
Оценка: -1
Здравствуйте, Dmitry3, Вы писали:

Не забудь написать B::operator =
Re[2]: Проблема при добавлении элемента в вектор.
От: Master Yoda Великобритания  
Дата: 03.08.06 11:44
Оценка:
Здравствуйте, Константин Л., Вы писали:

КЛ>Здравствуйте, Dmitry3, Вы писали:


КЛ>Не забудь написать B::operator =


Зачем? Судя по приведенному примеру подойдет дефолтный
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
It is always bad to give advices, but you will be never forgiven for a good one.
Oscar Wilde
Re: Проблема при добавлении элемента в вектор.
От: Dmitry3  
Дата: 03.08.06 12:31
Оценка:
Большое спасибо за помошь!

Оказывается, я сам виноват — по недосмотру один и тот же элемент у меня удаллся из вектора два раза перед тем, как поступал на выполнения тот код, что я написал в сообщении. Это и влияло каким-то образом на вектор — он начинал глючить.

И заметьте — ни одного сообщения об ошибке!
Re[3]: Проблема при добавлении элемента в вектор.
От: Константин Л.  
Дата: 03.08.06 13:34
Оценка:
Здравствуйте, Master Yoda, Вы писали:

MY>Здравствуйте, Константин Л., Вы писали:


КЛ>>Здравствуйте, Dmitry3, Вы писали:


КЛ>>Не забудь написать B::operator =


MY>Зачем? Судя по приведенному примеру подойдет дефолтный


ну по примеру да, но я подозреваю, что человек напишет что-нибудь, где он будет использоваться
Re[2]: Проблема при добавлении элемента в вектор.
От: De Bug Финляндия  
Дата: 04.08.06 08:10
Оценка:
D>один и тот же элемент у меня удаллся из вектора два раза ... Это и влияло каким-то образом на вектор — он начинал глючить.
D>И заметьте — ни одного сообщения об ошибке!
А как удалялся этот элемент?
Re[3]: Проблема при добавлении элемента в вектор.
От: Dmitry3  
Дата: 04.08.06 12:40
Оценка:
Здравствуйте, De Bug, Вы писали:

D>>один и тот же элемент у меня удаллся из вектора два раза ... Это и влияло каким-то образом на вектор — он начинал глючить.

D>>И заметьте — ни одного сообщения об ошибке!
DB>А как удалялся этот элемент?

Я искал элемент при помощи find(myVtr.begin(), myVtr.end()) затем, если полученный итератор не равен myVtr.end() далял его методом erase():

std::vector<B> myVtr;
std::vector<B>::iterator curr;

.....

curr = find(myVtr.begin(), myVtr.end());
if(curr != myVtr.end())
{
myVtr.erase(curr);
}

этот код выполнялся последовательно и независимо два раза перед тем, как я пытался добавить новый элемент в этот вектор.
Re[4]: Проблема при добавлении элемента в вектор.
От: De Bug Финляндия  
Дата: 04.08.06 14:04
Оценка:
    std::vector<int> myVtr;
    std::vector<int>::iterator curr;

    myVtr.push_back(1);
    myVtr.push_back(2);

    curr = std::find(myVtr.begin(), myVtr.end(), 1);
    if(curr != myVtr.end())
    {
        myVtr.erase(curr);
    }

    curr = std::find(myVtr.begin(), myVtr.end(), 1);
    if(curr != myVtr.end())
    {
        myVtr.erase(curr);
    }

    myVtr.push_back(2);
    std::cout<<myVtr.size()<<std::endl;

Вот такой код работает нормально. Он отличается от вашего?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.