2014-10-27 39 views
0

我有一个类,其中生成新对象并将它们存储在一个数组中。问题是,只要添加第二个对象,第一个对象的数据就会被第二个数据覆盖。 我在做什么错? 由于阵列中的C++对象未编写

Rotor rot[100]; // How can I make this flexible? 

int main(int argc, char **argv) { 


    for (int i = 1; i < (argc - 1); i++) { 
     ifstream inFile; 
     inFile.open(argv[i]); 
     if (inFile.fail()) { 
      throw std::invalid_argument("Error reading file!"); 
      return 1; 
     } 
     rot[i] = Rotor(); 
     int n; 
     while (inFile >> n) { 
      rot[i].import(n); 
     } 
    } 
... 

类转子:

#include "Rotor.h" 

int inmap[26]; 
int outmap[26]; 
int impcount; 

Rotor::Rotor() { 
    impcount = 0; 
} 

void Rotor::import(int i) { 
    outmap[i] = impcount; 
    inmap[impcount] = i; 
    impcount++; 
} 

现在转子[1] .outmap [0]为1,在开始的时候,但在我加入转子[2]它改变为相同的值作为rotor [2] .outmap [0] = 2. 还有一种方法可以使数组长度变得灵活,以便它只使用尽可能多的空间。这在后面的方法中是必需的。

由于

+0

'Rotor rot [100]; //我怎样才能使这个灵活?'=>'vector rot; rot.resize(N);' – 2014-10-27 17:18:17

回答

2

Rotor类使用静态数组(由所有isntances共享)来存储其内部数据。这就是为什么Rotor的每个后续实例出现在之后的第一个覆盖。这真是太糟了。一般而言,您应该避免使用C++程序中的静态(全局)数据。

int inmap[26]; 
int outmap[26]; 
int impcount; 

你需要做的类,而不是那些私有成员:

class Rotor{ 
    private: 
     int inmap[26]; 
     int outmap[26]; 
     int impcount; 
     // other private members here 
    public: 
     // constructor and other public methods here 
}; 

至于使阵列灵活的,你可以自己动手完成它(使用在堆上分配的数组,当项目数量等于容量时调整数组的大小 - 每次通过分配新阵列,复制旧数组的内容和删除原始数据,您可以在每次满足当前容量时加倍容量),或者更容易且更少出错,只需使用动态数组实现,如std::vector

0

您正在全球范围内声明您的变量。

请看一看的CPP范围:

http://www.tutorialspoint.com/cplusplus/cpp_variable_scope.htm

麦克说,你需要声明它们的类内。我想你想直接访问这些数组,如:myrotorobject.inmap [0]。那么我会建议让他们公开而不是私人。

+0

我会反对公开内部数组。最好是创建访问器方法来在公共表面上操作它们。 – 2014-10-27 19:41:44