类更改其他类的数据成员

时间:2015-01-06 22:24:06

标签: c++ class

我的C ++程序中有两个类MaxsegtreeMinsegtree

Maxsegtree有2个私有数据成员PQ,在创建实例时动态分配内存。

班级Minsegtree有类似的2位数据成员AB

当我调用类Minsegtree的成员函数时,Maxsegtree A的数据成员的值会发生变化。

This is the ideone link to the program.

#include <iostream>

using namespace std;

class Maxsegtree
{
    int* P;
    int* Q;
public:
    Maxsegtree(int N)
    {
        P = new int[N];
        Q = new int[2 * N];
    }

    ~Maxsegtree()
    {
        delete[] P;
        delete[] Q;
    }

    int getP(int i)
    {
        return P[i];
    }

    void setP(int i, int x)
    {
        P[i] = x;
    }

    void build_tree(int node, int l, int r)
    {
        if (l == r)
            Q[node] = l;
        else
        {
            build_tree(node * 2, l, (l + r) / 2);
            build_tree(node * 2 + 1, (l + r) / 2 + 1, r);
            if (P[Q[2 * node]] > P[Q[2 * node + 1]])
                Q[node] = Q[2 * node];
            else
                Q[node] = Q[2 * node + 1];
        }
    }
};

class Minsegtree
{
    int* A;
    int* B;
public:
    Minsegtree(int N)
    {
        A = new int[N];
        B = new int[2 * N];
    }

    ~Minsegtree()
    {
        delete[] A;
        delete[] B;
    }

    int getA(int i)
    {
        return A[i];
    }

    void setA(int i, int x)
    {
        A[i] = x;
    }

    void build_mintree(int node, int l, int r)
    {
        if (l == r)
            B[node] = l;
        else
        {
            build_mintree(node * 2, l, (l + r) / 2);
            build_mintree(node * 2 + 1, (l + r) / 2 + 1, r);
            if (A[B[2 * node]] <= A[B[2 * node + 1]])
                B[node] = B[2 * node];
            else
                B[node] = B[2 * node + 1];
        }
    }
};

int main()
{
    int n;
    int x;
    cin >> n;
    Minsegtree mint(n);
    Maxsegtree maxt(n);
    for (int i = 0; i < n; i++)
    {
        cin >> x;
        mint.setA(i, x);
        maxt.setP(i, x);
    }
    cout << "Before function is called" << endl;
    for (int i = 0; i < n; i++)
        cout << maxt.getP(i) << " ";
    cout << endl;
    mint.build_mintree(1, 0, n - 1);
    cout << "After function is called" << endl;
    for (int i = 0; i < n; i++)
        cout << maxt.getP(i) << " ";
    cout << endl;
    return 0;
}

有人可以告诉我我做错了吗?

3 个答案:

答案 0 :(得分:2)

很可能你是在极限之外访问数组。

使用std::vector而不是原始指针添加支票,并使用.at()代替[]进行访问。代码如:

B[node] = l;
例如

成为

B.at(node) = l;

这样,如果您在限制之外访问,则会抛出std::out_of_range异常。

使用vector而不是手动分配的数组也会关注重新分配以及复制构造函数和赋值的正确实现,以防您最终使用它们。

答案 1 :(得分:1)

您正在访问Minsegtree :: build_mintree中的范围内存位置。手动检查或使用valgrind,start的好地方。

答案 2 :(得分:1)

build_mintree中,如果node不是2的幂,则2*N的值可能会超过N(例如,对于n=18,它超过40 ),因为树变得稀疏。