使用c ++的类中的2D数组

时间:2013-10-30 18:14:20

标签: c++ class gnu

我写了一个代码来呈现一个类第三个接受其他两个类的实例分别为One和Two,一切都工作正常,直到我添加了一个矩阵Mat,并且方法get_Mat在第三个类中,在它拥有的代码中name三,这段代码不会产生任何错误信息,但是当执行它时直到在main中返回0之前的行,然后它会因编译器遇到错误而终止,需要关闭,我希望你能帮忙我发现了问题。

感谢。

#include<iostream>
#include<vector>
#include <stdlib.h>   
using namespace std;

class One        // this the first class
{
 private:
     unsigned int id;                                 
public:   
    unsigned int get_id(){return id;};   
    void set_id(unsigned int value) {id = value;};
    One(unsigned int init_val = 0): id(init_val) {};   // constructor
    ~One() {};                                         // destructor
};
////////////////////////////////////////////////////////////////////
class Two        // the second class
{
  private:
    One first_one;                 
    One second_one;                
    unsigned int rank;                      
  public:   
    unsigned int get_rank() {return rank;};
    void set_rank(unsigned int value) {rank = value;};
    unsigned int get_One_1(){return first_one.get_id();};
    unsigned int get_One_2(){return second_one.get_id();};

    Two(const One& One_1 = 0, const One& One_2 =0 , unsigned int init_rank = 0)
    : first_one(One_1), second_one(One_2), rank(init_rank)
     {
     }  

    ~Two() {} ; // destructor

};
///////////////////////////////////////////////////////////// 
class Three     // the third class  
{
private:
     std::vector<One>   ones;
     std::vector<Two>   twos;    
     vector<vector<unsigned int> > Mat;

public:
     Three(vector<One>& one_vector, vector<Two>& two_vector)
    : ones(one_vector), twos(two_vector)
     { 
       for(unsigned int i = 0; i < ones.size(); ++i)
            for(unsigned int j = 0; j < ones.size(); ++j)
                Mat[i][j] = 1;
     }

     ~Three() {};

     vector<One> get_ones(){return ones;};
     vector<Two> get_twos(){return twos;};
     unsigned int get_Mat(unsigned int i, unsigned int j) { return Mat[i][j];};
     void set_ones(vector<One> vector_1_value) {ones = vector_1_value;};
     void set_twos(vector<Two> vector_2_value) {twos = vector_2_value;};


};
///////////////////////////////////////////////////////////////////////
int main()
{
cout<< "Hello, This is a draft for classes"<< endl;
vector<One> elements(5);
cout<<elements[1].get_id()<<endl;

vector<Two> members(10);
cout<<members[8].get_One_1()<<endl;

Three item(elements, members);
cout<<item.get_ones()[3].get_id() << endl;  

cout << item.get_Mat(4, 2) << endl;
return 0;
}

1 个答案:

答案 0 :(得分:1)

首先,当你在这里构建类Three的对象时:

 Three item(elements, members);

Mat成员的大小为vector<vector<unsigned int> >。纯粹的巧合是构造函数不会立即崩溃。例如,如果您需要大小为n x m的矩阵,则必须执行

 Mat.resize(n);
 for(unsigned int i =0;i<n;++i)
      Mat[i].resize(m);

之前可以安全地使用Mat[i][j]等表达式。

其次,在Three的构造函数中:

   for(unsigned int i = 0; i < ones.size(); ++i)
        for(unsigned int j = 0; j < ones.size(); ++j)
            Mat[i][j] = 1;

是否打算在其中一个循环中不使用twos.size()