首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >数组中的C++对象已写入

数组中的C++对象已写入
EN

Stack Overflow用户
提问于 2014-10-28 01:14:38
回答 2查看 53关注 0票数 0

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

代码语言:javascript
复制
    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);
        }
    }
...

级转子:

代码语言:javascript
复制
#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++;
}

现在rotor1.outmap在开始时是1,但是在我添加了rotor2之后,它变成了与rotor2.outmap =2相同的值。是否还有一种方法可以使数组长度灵活,以便只使用所需的空间?这在后面的方法中是必需的。

谢谢

EN

回答 2

Stack Overflow用户

发布于 2014-10-28 01:18:43

您的Rotor类使用静态数组(由所有store共享)来存储其内部数据。这就是为什么每个后续的转子实例似乎都会覆盖第一个实例。这是非常糟糕的。通常,您应该避免在C++程序中使用静态(全局)数据。

代码语言:javascript
复制
 int inmap[26];
 int outmap[26];
 int impcount;

您需要将这些私有成员改为该类的私有成员:

代码语言:javascript
复制
 class Rotor{
    private:
        int inmap[26];
        int outmap[26];
        int impcount;
        // other private members here
    public:
        // constructor and other public methods here
 };

就使数组灵活而言,您可以手动完成(使用在堆上分配的数组,当项的数量等于容量时调整数组的大小-每次通过分配新数组,复制旧数组的内容并删除原始数组,每次满足当前容量时,您都可以将容量加倍),或者更简单,更不容易出错,只需使用动态数组实现,如std::vector

票数 2
EN

Stack Overflow用户

发布于 2014-10-28 01:41:34

您在全局作用域中声明变量。

请看一下cpp作用域:

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

正如mike所说,您需要在类中声明它们。我猜您想要直接访问这些数组,比如: myrotorobject.inmap。那么我建议将它们设置为公共的,而不是私有的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26593039

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档