我是 C++ 的新手,这是我从 Fortran 升级后的第一周。抱歉,如果这是一个简单的问题,但有人可以帮助我解决运算符重载问题。我写了一个有两个类的程序。一个对象包含一个 vector 和两个标量,另一个类仅包含第一个对象。在这段代码的测试实现中,我怀疑运算符重载有问题。该计划试图实现以下目标:
1) 初始化第一个结构。 2) 初始化包含已初始化的第一个结构的第二个结构。导入后,值 val0 = 10 将添加到封闭结构 structure2.structure1 中 vector 的每个元素。 3) 输出structure1和structure2变量进行比较。
对于这个简单的程序,我的输出是:
100
100
0
0
0 0 10
1 1 11
2 2 12
3 3 13
...
我期待:
100
100
0
10
0 0 10
1 1 11
2 2 12
3 3 13
...
很明显,我的重载 = 运算符正确地复制了我的 vector ,但是标量之一?有人可以帮忙吗?
#include <iostream>
using namespace std;
typedef double* doublevec;
// This first class contains a vector, a scalar N representing the size of the vector, and another scalar used for intializing the vector.
typedef class Structure1
{
int N, vec0;
doublevec vec;
public:
// Constructor and copy constructor.
Structure1(int Nin, int vecin) : N(Nin), vec0(vecin) { vec = new double [N]; for(int i = 0; i < N; i++) { vec[i] = i + vec0; } }
Structure1(const Structure1& structurein);
// Accessor functions:
int get_vec0() { return vec0; }
int get_N() { return N; }
doublevec get_vec() { return vec; }
// Overide equivalence operator:
Structure1& operator=(const Structure1& right)
{
//Handle Self-Assignment
if (this == &right) return *this;
N = right.N;
vec0 = right.vec0;
for (int i = 0; i < N; i++)
{
vec[i] = right.vec[i];
}
return *this;
}
// Destructor:
~Structure1() { delete []vec; }
} Structure1;
Structure1::Structure1(const Structure1& structurein)
{
N = structurein.N;
vec = new double[N];
for(int i = 0; i < N; i++)
{
vec[i] = structurein.vec[i];
}
}
// This class just contains the first structure.
typedef class Structure2
{
Structure1 structure;
// Mutator Function:
void mutate_structure();
public:
// Constructor:
Structure2(const Structure1& structurein) : structure(structurein) { mutate_structure(); }
// Accessor Function:
Structure1 get_structure() { return structure; }
// Destructor:
~Structure2() {}
} Structure2;
void Structure2::mutate_structure()
{
int N = structure.get_N();
Structure1 tempstruct(N,10);
structure = tempstruct;
}
int main (int argc, char * const argv[])
{
const int N = 100;
Structure1 structure1(N,0);
Structure2 structure2(structure1);
cout << structure1.get_N() << endl;
cout << structure2.get_structure().get_N() << endl;
cout << structure1.get_vec0() << endl;
cout << structure2.get_structure().get_vec0() << endl;
for(int i = 0; i < N; i++)
{
cout << i << " " << structure1.get_vec()[i] << " " << structure2.get_structure().get_vec()[i] << endl;
}
return 0;
}
最佳答案
看起来 vec0 没有被你的拷贝构造函数初始化...
尝试将您的复制构造函数修改为:
Structure1::Structure1(const Structure1& structurein)
{
N = structurein.N;
vec = new double[N];
for (int i = 0; i < N; i++)
{
vec[i] = structurein.vec[i];
}
// ADD THIS LINE
vec0 = structurein.vec0;
}
关于c++ - 运算符重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/842753/