【问题标题】:delcaring an object and initializing using a char* in c++在 C++ 中声明一个对象并使用 char* 进行初始化
【发布时间】:2018-02-03 11:54:46
【问题描述】:

我是 C++ 初学者,我无法编译以下代码 问题出在T a = s 语句中,其中s 是包含abcdechar*

这里的目标是声明一个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。这很可能会导致崩溃。你不需要那条线。

标签: c++ class object char


【解决方案1】:

您在定义对象时误解了“赋值”。

当像你一样定义一个对象时

T a = s;

这不是一个赋值,它是一个对象构造,你需要一个带有const char*参数的构造器。

如果你这样做了

T a;
a = s;

那么这是一个任务。当然,这依赖于 T 有一个默认构造函数(一个不带任何参数的构造函数)。


您现在得到的错误是因为您需要一个复制构造函数,该构造函数通过 constant 引用获取其参数。定义

T a = s;

实际上等于

T a = T(s);

T(s) 创建一个临时对象,一旦 a 的完全初始化完成,该对象将被销毁。并且非常量引用不能绑定到临时对象,因此您的复制构造函数需要接受const T&amp; 参数。

【讨论】:

  • 即使使用构造函数我仍然得到错误 T(const char* s){ int n ; for(int i = 0 ; s[i] != '\0' ;i++ ) n++ ; nb = n ; pc=新字符[nb]; for(int i=0 ; i
  • @KhalilKasmi 什么你得到了什么错误?在发布有关构建错误的问题时,请始终完整地复制粘贴它们。请编辑您的问题以包含该内容。
  • @KhalilKasmi 更新了我的答案。您可能想invest in a couple of good books,因为所有这些都应该包含在这些内容中。
【解决方案2】:

初始化不使用 operator=。它使用构造函数代替,尽管 = 登录语法。所以你需要有带有签名 T::T(char*) 的构造函数。顺便说一句,我强烈建议将其设为 const char* 以避免编译器因为分配给它字符串文字而对你大喊大叫。

【讨论】:

    猜你喜欢
    • 2010-10-22
    • 1970-01-01
    • 2021-04-15
    • 2017-01-11
    • 1970-01-01
    • 2023-01-26
    • 2016-09-26
    • 1970-01-01
    • 2016-02-02
    相关资源
    最近更新 更多