【问题标题】:C++ Objects in Array owerwritten [closed]数组中的 C++ 对象被改写[关闭]
【发布时间】:2014-10-27 17:14:38
【问题描述】:

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

    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] 之后,它变为与转子[2].outmap[0] = 2 相同的值。 还有一种方法可以使数组长度灵活,以便它只使用所需的空间吗?后面的方法需要用到。

谢谢

【问题讨论】:

  • Rotor rot[100]; // How can I make this flexible? => vector&lt;Rotor&gt; rot; rot.resize(N);

标签: c++ arrays memory stack-overflow


【解决方案1】:

您的Rotor 类使用静态数组(由所有实例共享)来存储其内部数据。这就是为什么 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

【讨论】:

    【解决方案2】:

    您在全局范围内声明变量。

    请查看 cpp 范围:

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

    正如迈克所说,您需要在类中声明它们。我猜您想直接访问这些数组,例如:myrotorobject.inmap[0]。然后我建议将它们设为公开而不是私有。

    【讨论】:

    • 我反对公开内部数组。最好创建访问器方法来在公共表面上操作它们。
    猜你喜欢
    • 1970-01-01
    • 2021-12-15
    • 2021-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-22
    • 2015-01-19
    • 1970-01-01
    相关资源
    最近更新 更多