【发布时间】:2018-02-03 11:54:46
【问题描述】:
我是 C++ 初学者,我无法编译以下代码
问题出在T a = s 语句中,其中s 是包含abcde 的char*。
这里的目标是声明一个T 的对象并用s 对其进行初始化。
我这行for(int i = 0; i < a(); i++)也有问题。
我不知道如何使用构造函数或名为a() 的函数来返回大小。
这是我的代码:
#include <iostream>
#include <cassert>
using namespace std;
class T{
int nb ;
char *pc;
public:
T(int);
~T();
T(T&);
char& operator[](int);
T(const char* s){
int n ;
for(int i = 0 ; s[i] != '\0' ;i++ ) n++ ;
nb = n ;
pc= new char[nb];
for(int i=0 ; i < nb ; i++) pc[i] = s[i];
}
};
T::T(int k){
assert(k > 0);
nb = k;
pc = new char[nb];
}
T ::~T(){
if( pc != NULL) delete [] pc;
}
T::T(T& t){
nb=t.nb;
delete[] pc;
pc = new char[nb];
for(int i=0 ; i < nb ; i++) pc[i] = t.pc[i];
}
char& T::operator[](int index){
assert(index >=0 && index <= nb);
return pc[index];
}
int main(){
char* s = "abcde";
T a = s;
for(int i = 0; i < a(); i++)
cout << a[i] << " ";
cout << endl;
T b = a;
b[1] = '*';
b[3] = '*';
for(int i = 0; i < b(); i++)
cout << b[i] << " ";
cout << endl;
return 0;
}
我收到以下错误:
从“T”类型的右值初始化“T&”类型的非常量引用无效|
【问题讨论】:
-
你应该使用
std::string而不是char数组。 -
练习没有提到使用字符串
-
既然你标记了C++,你cannot initialize
char*with a string literal. -
在您的复制构造函数中,您正在对未初始化的值调用 delete[] pc。这很可能会导致崩溃。你不需要那条线。