“从'char'到'char *'的转换无效

时间:2016-02-22 12:08:34

标签: c++ constructor

我最近开始学习C ++,但是我的构造函数遇到了问题。我的类文件的简单示例

class Test {

private:

    char *type;

public:

    Test(const char *type); //this is my constructor

};

现在我在尝试实现构造函数时遇到了问题。

Test::Test(const char *type){

this-> type = *type;

}

我收到错误:“从'char'到'char *'的转换无效。现在我搜索了这个网站和网络上的解决方案。但是没有找到任何针对我的具体问题。我可以想象解决方案是很简单,但是对于我的爱,我无法理解。

2 个答案:

答案 0 :(得分:1)

尝试

Test::Test(const char *type){

this-> type = type;

}

并且erip表示尝试使用std::string。尝试尽可能使用STL。

答案 1 :(得分:1)

您的问题:

char *type;

这将type声明为指向char指针。它指向到某个内存,其中(希望)有一个字符数组,以空字节结尾。

Test(const char *type);

这意味着您的类有一个接收指向const char 指针的构造函数。

this->type = ...

分配给您的成员type,即指针 type指向 < em>不同的内存位置。

... = *type;

不幸的是,在参数*上使用运算符type意味着您没有指定指针,但第一个字符type的值指向,当然 - 这不是一个有效的记忆地址。

即使省略了*运算符,您仍然会遇到问题:

  • 成员 type是指向char的指针。
  • 参数 type是指向const char的指针。

你不能将某些内容const分配给非const,至少不能没有广告,而 也不应该这样做。

它也是一个&#34;浅拷贝&#34;的一个例子,即你的类没有自己的拷贝它构造的字符串,但只有指向某些字符串的指针记忆它无法控制。那不是一个好的设计。

总而言之,&#34;解决方案&#34; 在这里:

使用C ++进行编程时,请按照C ++进行编程。

// Use std::string.
#include <string>

class Test {
    public:
        Test( const std::string & type ) : _type( type ) {}

    private:
        std::string _type;
};

如果您坚持使用C字符串,那将看起来像这样:

#include <cstring>

class Test {
    public:
        Test( const char * type )
        {
            // Assign memory and *copy* the string
            _type = new char[ std::strlen( type ) + 1 ];
            std::strcpy( _type, type );
        }

        ~Test()
        {
            // Remember to *release* the memory when you are done
            delete [] _type;
        }

    private:
        char * _type;
};