2013-04-09 1 views
0

У меня есть вопрос для вас. Предположим, у меня есть вектор AwesomeData, а класс AwesomeData содержит вектор AwesomeData. Если я попытаюсь получить доступ к вектору внутри первого вектора, он работает неправильно. Насколько я знаю, здесь не совсем ясно, что более явный пример:Stange поведение вектора C++

struct AwesomeData 
{ 
public: 
    AwesomeData() 
    : beautifulInt(3) 
    {} 

    int beautifulInt; 
    vector<AwesomeData> someVector; 
}; 

int main() 
{ 
    vector<AwesomeData> tata; 
    AwesomeData toto; 

    toto.someVector.push_back(AwesomeData()); 
    toto.someVector.push_back(AwesomeData()); 
    toto.someVector.push_back(AwesomeData()); 

    tata.push_back(AwesomeData()); 
    tata.push_back(toto); 
    tata.push_back(AwesomeData()); 


    // So, now tata should containt the data of someVector of toto (3 default  
    // AwesomeData). Instead of that, his capacity is equal to 3, but his 
    // size = 0. So, what's wrong ? 
    tata = tata[1].someVector; 
} 

Но эй, это еще не все! Я нашел работу, но я не знаю, почему она работает.

struct AwesomeData 
{ 
public: 
    AwesomeData() 
     : beautifulInt(3) 
    {} 

    int beautifulInt; 
    vector<AwesomeData> someVector; 
}; 

int main() 
{ 
    vector<AwesomeData> tata; 
    AwesomeData toto; 

    toto.someVector.push_back(AwesomeData()); 
    toto.someVector.push_back(AwesomeData()); 
    toto.someVector.push_back(AwesomeData()); 

    tata.push_back(AwesomeData()); 
    tata.push_back(toto); 
    tata.push_back(AwesomeData()); 


    // If we use a second vector to temporaly stock the vector of toto, 
    // everything work as expected 
    vector<AwesomeData> tempVector; 

    tempVector = tata[1].someVector; 
    tata = tempVector; 
} 

У кого-нибудь есть идея?

Большое спасибо

+1

[ 'tata.size()' '3' является здесь] (http://ideone.com/7hsoV5). –

+4

Как-то я сомневаюсь, что это фактическая причина, но ваш код является незаконным, имеет неопределенное поведение и не скомпилируется с некоторыми компиляторами. Вы не можете создать вектор неполного типа. –

+0

@sftrabbit Побей меня. – cdhowie

ответ

3

стандартные контейнеры не позволяют их экземпляры с в комплекте типов. В вашем примере AwesomeData не полностью определен, когда вы пытаетесь создать экземпляр std::vector<AwesomeData>.

Для этого вы можете взглянуть на библиотеку boost::container.

см Boost::container

Смежные вопросы