gpt4 book ai didi

c++ - 在 C++ 中声明一个对象并使用 char* 进行初始化

转载 作者:行者123 更新时间:2023-11-27 23:48:32 28 4
gpt4 key购买 nike

我是一名 C++ 初学者,我在编译以下代码时遇到了问题问题出在声明中 T a = s其中 schar*包含 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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com