类更改数据其他类的成员
Class changing data members of other class
我的C++程序中有两个类Maxsegtree
和Minsegtree
。
类 Maxsegtree
有 2 个私有数据成员P
和Q
,内存在创建实例时动态分配。
类 Minsegtree
具有类似的 2 个数据成员A
和B
。
当我调用类 Minsegtree
的成员函数时,Maxsegtree
A
的数据成员的值正在更改。
这是程序的 ideone 链接。
#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;
}
有人可以告诉我我做错了什么吗?
很可能您正在访问超出限制的数组。
通过使用std::vector
而不是原始指针以及使用.at()
而不是[]
进行访问来添加检查。代码如下:
B[node] = l;
例如成为
B.at(node) = l;
这样,如果您超出限制进行访问,则会引发std::out_of_range
异常。
vector
s 而不是手动分配的数组还将注意复制构造函数和赋值的释放和正确实现,以防您最终使用它们。
您正在访问 Minsegtree::build_mintree 中的超出范围的内存位置。手动检查或使用valgrind,这是一个很好的起点。
在build_mintree
中,如果N
不是 2 的幂(例如,对于 n=18
超过 40),node
的值可能会超过 2*N
,因为树变得稀疏。
相关文章:
- 保留对其他类的成员函数的引用
- 成员包含其他继承类的继承类?
- 线程消息传递或更好:在"大师班"中访问其他班级的成员
- 锁定来自其他线程的类成员
- 为什么我可以访问其他班级的私人成员?
- C++:从其他类访问结构的私有成员向量
- 将基类的成员函数重载到其他派生类C++
- 用于对项目进行分组并将单个项目映射到其他组成员的数据结构
- 只对向量中的一个类成员进行排序,其他成员保持不变
- 成员函数不能为集合迭代器和const_iterator的输入重载(但可以为其他 STL 迭代器重载)
- 使用其他成员初始化结构的成员?
- 其他类的成员函数对成员函数的嵌套引用
- C++ 将类成员函数传递给其他类
- 访问其他类中多个对象的私有成员向量
- 对 Eclipse 项目库的更改将还原给团队的其他成员
- 其他成员函数的通用"成员函数"包装器?
- 在另一个 QThread 上运行成员方法时,无法将事件发送到其他线程拥有的对象
- 如果类包含基类类型的成员作为第一个元素,后跟其他成员,编译器是否可以优化空基?
- 将成员函数作为参数传递给其他成员函数 (C++ 11 <function>)
- 将元组成员包装在其他模板化类型中