【问题标题】:char* and a char[] array errorchar* 和 char[] 数组错误
【发布时间】:2011-11-02 02:07:55
【问题描述】:

我正在尝试为我正在为我的高中 c++ 课程制作的游戏创建一个课程。我所有的设置功能都不起作用。我将发布一个专门为展示一个示例(我对所有这些都得到相同的错误)。这是问题:

#include <iostream>

using namespace std;

class room {

public:

    void set_desk(char *);
    char get_desk();

private:

char desk[16];

}

int main {

room room1;
room1.set_desk("a desk");

cout << room1.get_desk();
return(0);
}
void room::set_desk(char *a){
     room::desk = *a;
}
char room::get_desk(){
     return(room::desk);
}

所以当我尝试编译它时,我得到这个错误:“In member function void room::set_desk(char *)': error: in compatible types in assignment of char to char[16]”还有这个错误: “在成员函数 char room::get_desk() 中:错误:从 char* 到 char 的无效转换”。

我需要 char 有一个 16 的数组,但是如果我从 char desk[16]; 中删除 [16],错误就消失了

【问题讨论】:

  • 你为什么不用std::string
  • char* 分配给char[] 不能这样做,您想使用strcpy/strncpy 或将desk 更改为指针,这将很可能是一个非常糟糕的主意,或者像 GWW 所说的那样,如果您使用 C++,请改用 std::string
  • 使用std::string。严重地。如果您坚持使用原始指针和字符数组,请不要假装您正在“学习 C++”。那不是 C++。
  • C++,但我同意他应该在这里使用std::string

标签: c++ class char


【解决方案1】:

您不能将指针分配给这样的数组。这是让它发挥作用的一种方法。

void room::set_desk(char *a){

    if (strlen(a) >= sizeof(desk)){
        //  Internal buffer is not large enough. Handle error.
    }

    strcpy(desk,a);
}
char* room::get_desk(){
     return desk;
}

不过,您最好在 C++ 中使用 stringsvectors 而不是 char 数组和指针。

*您在类定义后还缺少一个分号。

这是一个更像 C++ 的方法:

class room {

public:

    void set_desk(string);
    string get_desk();

private:

    string desk;

};

void room::set_desk(const string &a){
     desk = a;
}
string room::get_desk(){
     return desk;
}

int main {

    room room1;
    room1.set_desk("a desk");

    cout << room1.get_desk();

    return 0;
}

【讨论】:

  • 我明白了。我的 c++ 老师总是告诉我使用 char 数组。不过,我还有另一个问题。我还使用 char 数组,这样我就可以一次分析用户输入的一个字母。有没有办法用字符串做到这一点?如果没有,我总是可以使用字符串比较函数。
  • 是的,您可以像访问数组一样访问字符串中的单个字符(使用[])。如果您有string str = "abc";,那么str[0] 将给出第一个字母(a),str[1] 将给出第二个字母,依此类推...
  • 你的C++老师有没有给你一个使用char数组的原因?如果没有,你怎么知道什么时候使用它们?
  • @user1024742:听上去,对于 C++ 教育,你能做的最好的事情就是不要听那个老师的话,而是读一本好书!
  • @user1024742:使用 Mysticial 的 strcpy 建议。你的老师鼓励你摆弄数组和指针是对的。一旦你熟悉了 C 的低级数组和指针,你就会明白为什么像 std::string 这样的高级 C++ 特性很有用,以及何时使用它们。
【解决方案2】:

你不需要在每个对桌子的引用前加上房间::

strncpy(desk,a,sizeof(desk)-1);

desk[sizeof(desk)-1] = 0;

使用上述方法,您可以安全地更改办公桌的大小。

将 getter 的返回类型更改为 char*

【讨论】:

  • 查看我对 Mystical 回答的评论,了解为什么会出现这种情况。
  • 通过确保始终存在空值来修复
猜你喜欢
  • 2013-12-19
  • 2017-09-13
  • 1970-01-01
  • 2019-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-10
  • 2017-12-05
相关资源
最近更新 更多