我是一名 C++ 初学者,我在编译以下代码时遇到了问题
问题出在声明中 T a = s
其中 s
是 char*
包含 abcde
.
这里的目标是声明一个 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&”的非常量引用无效|
最佳答案
您在定义对象时误解了“赋值”。
当像你一样定义一个对象时
T a = s;
这不是一个赋值,它是一个对象构造,你需要一个带有const char*
参数的构造函数。
如果你这样做
T a;
a = s;
然后这是一个作业。当然,这依赖于 T
具有默认构造函数(不接受任何参数的构造函数)。
你现在得到的错误是因为你需要一个复制构造函数,它通过常量 引用获取它的参数。定义
T a = s;
实际上等于
T a = T(s);
T(s)
创建一个临时对象,一旦 a 的完全初始化完成,该对象就会被销毁。并且非常量引用不能绑定(bind)到临时对象,因此您的复制构造函数需要接受一个 const T&
参数。
关于c++ - 在 C++ 中声明一个对象并使用 char* 进行初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48597074/