2013-04-09 18 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)。 – 2013-04-09 14:33:55

+4

不知何故,我怀疑这是真正的原因,但是你的代码是非法的,有未定义的行为,并且无法用一些编译器进行编译。您不能创建不完整类型的矢量。 – 2013-04-09 14:34:24

+0

@sftrabbit击败我。 – cdhowie 2013-04-09 14:34:50

回答

3

标准容器不允许您使用不完整类型实例化它们。在你的例子中,当你尝试实例化一个std::vector<AwesomeData>时,AwesomeData没有完全定义。

要达到此目的,您可以查看boost::container库。

看到Boost::container