c++错误:从不兼容的类型'const char *'分配给'char *'

Posted

技术标签:

【中文标题】c++错误:从不兼容的类型\'const char *\'分配给\'char *\'【英文标题】:c++ error: assigning to 'char *' from incompatible type 'const char *'c++错误:从不兼容的类型'const char *'分配给'char *' 【发布时间】:2015-09-20 21:30:53 【问题描述】:

我在为我的 c++ 课程分配编程作业时遇到问题,我不确定我应该如何做才能不出错。我对编程很陌生,所以这可能真的很容易。

在我的说明中,我们必须创建一个类来处理其他代码,这些代码提供给我们一些指导方针。我有三个文件:program.h、program.cpp 和 main.cpp。

程序.h

//program.h
#include <iostream> 
#include <stdint.h>\\This program uses type uint32_t so had to include this
#include <cstdlib>

class Program

   public:
   Program(); //was told to create a default constructor to initiate values if none are given
   Program(char *, uint32_t, float); //was told to create an overloaded default constructor to change variables in program
   void SetName ( const char* ); //given by the professor
//other function prototypes are here but they are working fine.

   private:
   char * name_; //given by professor
   uint32_t code_;//given by professor
   float cost_;//given by professor

   
;

程序.cpp

//program.cpp
//other functions from class are in this file, just not giving any issues
Program::Program(char * name,uint32_t code, float cost) : name_(name), code_(code), cost_(cost)



Program::Program() : name_(NULL), code_(0x00000000), cost_(0.0)


void Program::SetName(const char* name)

   name_= name; //where the issue appears to occur since name is a const char *

目前正在尝试使用 makefile 和 program.h program.cpp 编译 program.o,因此 main.cpp 无关紧要。当我尝试编译时,我收到以下错误:

clang++ -oprogram.h 程序.cpp program.cpp:17:9:错误:从不兼容的类型“const char *”分配给“char *”

name_ = 名称;

因为函数是 void SetName (const char*);是教授给的,必须用。我不知道如何解决这个错误,因为变量 char * name_;也是教授给我们的。指针仍然让我有些困惑,但任何帮助将不胜感激。我一直认为常量数据可以传递给非常量数据,反之则不行。

【问题讨论】:

您确定要在SetName 中设置指针吗?您可能应该复制const char* name 指向的字符串 创建足够的空间来存储 name 并将 name 复制到 name_。不要忘记添加字符串终止符。如果你只是分配它,当 name 超出范围时,你会在 name_ 中得到垃圾。只要记住创建一个析构函数并在析构函数中将其删除即可。 这么多语法错误我不知道从哪里开始。这不是你的真实代码! 您没有在问题中显示有效的 c++ 代码。请先启动fixing this! 重要提示:name_= name; name_ 和 name 都是指向数据的指针,而不是数据。将一个分配给另一个会指向同一个内存块。如果您使用一个指针更改内存块,则同时更改两者。如果一个人释放了内存块,那么两者都会消失。即使没有编译器错误,你真的,真的不想这样做。 【参考方案1】:

重要的是要让这个问题消失:

 char * name_;

定义一个指向字符的指针。这只是一个指针。它不会创造一个角色。您将需要提供稍后指向的字符。这个指针可以用来改变它指向的内存。

const char* name

定义一个指针,指向一个不能改变的字符

无法更改的值与可以更改的值根本不同。您可以将不可更改的值复制到可更改的值中,但不能反过来,因为这需要更改不可更改的值。

可用于改变值的指针不能指向不可改变的值,以防止使用指针试图改变值的明显问题。

你需要做的是复制。

但首先,您需要分配存储空间来保存副本。这应该包含在您的文本中,留下一个问题:需要多少存储空间?

首先,您必须知道string is and how they are represented in C 是什么。不是 C++,而是 C。C++ 做的有点不同,你的教授最终会明白的。我希望。天哪,我真希望。与此同时,教授让你使用 C 风格的字符串。

strlen 主要解决了存储量的问题。 strlen 会告诉您格式正确的字符串的长度。字符串的定义暗示了它没有告诉您的内容。希望您阅读链接。

现在您知道需要多少存储空间,您可以使用new 分配存储空间。

现在你有一个name_ 指向足够的存储空间,你可以从name 的常量内存复制到它。 strcpy 在这里应该会有所帮助。

这很好,但是给您留下一个小问题:如果_name 已经有存储空间怎么办?嘘。我们只是覆盖了指向它的指针。这称为内存泄漏,这也是 C++ 以不同方式处理字符串的重要原因。

好的,所以在为name_ 分配存储空间并将name 的存储空间复制到其中之前,首先需要测试以确保name_ 为空。有几种方法可以做到这一点:

    设置金丝雀值。金丝雀是不可能的值;你永远不会看到的东西。通常对于指针,我们使用 NULL,一个美化的 0。按照惯例,地址 0 处没有任何内容,因此如果您看到指向零的指针,则说明有问题。如果在构造函数中确保name_ 为NULL,您将有一个简单的方法来知道name_ 是否还没有指向数据。

    保留一个长度值并在构造函数中将其设置为零。如果长度为零,则那里什么都没有。作为一个额外的好处,因为这使您可以知道存储的长度,您可以将其与新字符串所需的存储量进行比较。如果新字符串的大小相同或更小,您可以覆盖旧字符串。

如果您需要更换name_ 的存储空间,请在分配新存储空间之前delete[] 旧存储空间。

将它们放在一起,并使用选项 2,因为它更好,你会得到:

int len = strlen(name)
if len > length_
    delete name_
    name_ = new storage
strcpy(name_, name)

请注意,您必须填写一些缺少的部分。

作为一个混蛋,这就是 C++ 字符串的所有外观:

name_ = name;

看起来很眼熟?你不高兴你的教授决定先教你用最糟糕、最难的方法用 C++ 编程吗?

【讨论】:

感谢您的回复。这听起来像是我必须走的路,但我可以再问一个问题吗?是什么使它成为 c 风格的字符串与 c++ 风格的字符串?在我的书中,它给出的例子只有 int 变量;私下里,而不是像这个程序中的指针,我必须处理。这就是使它成为 c 样式字符串的原因吗? @user5356976 C 风格的数组包含在其中一个链接中。阅读。它会为你省去很多麻烦。 C++ string、std::string 是一个(很可能)围绕 C 风格字符串的类,它具有您需要的所有内存管理和一组实用方法,以使常见的字符串操作尽可能简单。在 C 中组合两个字符串和上面的一样混乱(分配空间,复制到字符串 1,复制到字符串 2)和 std::string 它是string three = one + two; 所有的猴子工作都为你完成了。【参考方案2】:

可能有一些错别字。你有空间

#include < iostream >

删除空格

#include <iostream>

将字符更改为

   const char * name_;

在 Program 类定义的最后一个 之后添加分号。

代码示例:

main.cpp

#include <iostream>
#include "program.h"

using namespace std;

int main(int argc, char const *argv[]) 
    cout << "Hello, World!" << endl;

    char const * name = "Claus";
    uint32_t code = 1967;
    float cost (3.14f);

    Program p (name, code, cost);
    cout << "getName(): " << p.getName() << endl;
    return 0;

程序.cpp

#include "program.h"

Program::Program() ;
Program::~Program() ;
Program::Program(char const * name,uint32_t code, float cost) : name_(name), code_(code), cost_(cost) 

void Program::SetName(const char* name) 
   name_= name; //where the issue appears to occur since name is a const char *


char const* Program::getName() 
    return name_;

程序.h

#ifndef PROGRAM_H
#define PROGRAM_H

#include <stdint.h>

class Program 
public:
    Program(); //was told to create a default constructor to initiate values if none are given
    ~Program();
    Program(const char * , uint32_t, float); //was told to create an overloaded default constructor to change variables in program
    void SetName (const char* );
    const char* getName();

private:
    const char * name_;
    unsigned int code_;
    float cost_;

;

#endif // PROGRAM_H

在我的 Mac 上我用它编译它

clang++ -std=c++11 -Wall -o main main.cpp program.cpp

我收到有关未使用变量的警告,但没关系。

user4581301 的回复启发了我学习一点 C。C++ 确实缓解了很多。

在程序.cpp中

Program::Program(char * name, uint32_t code, float cost) 
    unsigned int len = strlen(name);
    name_ = new char[len];
    strcpy(name_, name);

    code_ = code;
    cost_ = cost;


void Program::SetName(const char* name) 
    unsigned int len = strlen(name);
    delete name_;
    name_ = new char[len];
    strcpy(name_, name);

这个链接也帮助了我:how to initialize a char pointer in a class?

问候 克劳斯

【讨论】:

感谢您的回答,我仍在调查第一个回复。当我在这里重新输入时,您确实发现了一些我不小心漏掉的错别字(第一次在这里发帖),但是更改了 private: variable from char * name_;到 const char * name_;不是错字,那是教授给的指示。我现在正在研究 strcpy 的第一个响应,因为我没有任何其他解决方案。这些课程是由教授创建的一个课程评分的,所以不幸的是,如果没有这个课程,我无法改变他给我们的任何东西。 我是在我自己的上下文中,char name_ 没问题,不是错字。

以上是关于c++错误:从不兼容的类型'const char *'分配给'char *'的主要内容,如果未能解决你的问题,请参考以下文章

vs2017."const char *"的实参与"char *"的形参不兼容_goto跳过类型声明

E0167 “CHAR *”类型的参数与“const wchar_t *”类型的参数不兼容

C++标准库 如何连接两个const char *类型字符串,并返回const char * 类型结果?

“const char *”类型的参数与“Person”类型的参数不兼容

关于IntelliSense: "const char *" 类型的实参与 "char" 类型的形参不兼容问题

[转载] C++ string, const char*, char* 之间互相转换