我试图创建一个成员函数,该成员函数打印出我控制的数组,但是我遇到了Seg错误。任何帮助都将非常有用!
这是我的头文件,其中的所有代码都可以工作,最后一个成员函数除外。
#include <iostream>
#include <assert.h>
using namespace std;
#ifndef _ARRAY_H
#define _ARRAY_H
template<class T>
class Array{
private:
T *a;
int length;
public:
// constructor
Array (int len){
length = len;
a = new T[length];
for (int i = 0; i < len; i++){
a[i]=0;
}
}
// destructor
~Array()
{delete[] a;}
// operator overload
T& operator [](int i){
assert (i>=0 && i < length);
return a[i];
}
// operator overload
Array<T>& operator=(Array<T> &b){
if (a !=nullptr) delete[] a;
a = b.a;
b.a = nullptr;
length = b.length;
return *this;
}
//get the length of the array
int arraylength(){
return length;
}
//------------------This below is where I am having issue --------//
//print out the array
Array<T> printarray(){
for (int i = 0; i < length; i++){
cout << a[i];
}
}
};
int main();
#endif
这是我的主文件
#include <iostream>
#include "../include/array.h"
using namespace std;
int main(){
// initialize array
Array <int> a(5);
Array <int> b(5);
// put stuff into array
for (int i = 0; i< a.arraylength(); i++){
a[i] = i;
}
// set b = a using operator overload
b = a;
// print out the result b array
for (int i = 0; i < b.arraylength(); i++){
cout << b[i] << endl;
}
a.printarray();
return 0;
}
再次。谢谢您的帮助,我对C ++还是陌生的,而且大多是自学成才。
答案 0 :(得分:1)
您应该通过将返回类型更改为printarray
并将其设为void
成员函数来修复const
。
void printarray() const {
for (int i = 0; i < length; i++){
cout << a[i];
}
}
但是,这不是代码中的主要问题。主要问题是您没有遵循The Rule of Three。
行
b = a;
引起下游问题,可以通过遵循“三个规则”来解决。
这是应该有效的副本分配运算符功能的实现。
// Make the RHS of the operator a const object.
Array<T>& operator=(Array<T> const& b)
{
// Prevent self assignment.
// Do the real assignment only when the objects are different.
if ( this != &b )
{
if (a != nullptr)
{
delete[] a;
a = nullptr;
}
// This is not appropriate.
// a = b.a;
// b.a = nullptr;
// b needs to be left untouched.
// Memory needs to be allocated for this->a.
length = b.length;
if ( length > 0 )
{
a = new T[length];
// Copy values from b to this.
for (int i = 0; i < length; ++i )
{
a[i] = b.a[i];
}
}
}
return *this;
}
请注意,您还应该实现复制构造函数,然后使用复制交换惯用语来实现赋值运算符。
答案 1 :(得分:1)
在此声明中
b = a;
您调用了operator=
,其中a
对象的a
指针被设置为 nullptr ,但是在 printArray 中却没有不检查a
是否不为空,因此您要为空指针访问数据,这是未定义的行为。添加条件以检查数组是否为空:
void printarray(){
if (!a) return; // <- array is empty
for (int i = 0; i < length; i++){
cout << a[i];
}
}
第二, printArray 的返回类型应该为void
,在此函数中您不返回任何值。