char*和char[]数组错误

3

我正在尝试为我高中的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);
}

当我尝试编译这段代码时,出现了这个错误:"在成员函数 void room::set_desk(char *) 中:error: 不兼容类型,无法将 char 赋值给 char[16]",还有这个错误:"在成员函数 char room::get_desk() 中:error: 从 char* 到 char 的无效转换"。
我需要 char 变量拥有一个长度为 16 的数组,但如果我从 char desk[16]; 中删除 [16],这些错误就会消失。

5
为什么不使用std::string - GWW
1
char* 赋值给 char[] 是不可行的,你需要使用 strcpy/strncpy 或者将你的 desk 改为指针,但这很可能是一个非常糟糕的想法。或者像 GWW 所说,如果你在使用 C++,可以考虑切换到使用 std::string - wkl
2
使用std::string。认真点,如果你坚持用原始指针和字符数组胡乱搞,就别假装自己在“学习C ++”。那不是C ++。 - Kerrek SB
1
这确实是C++,但我同意他应该在这里使用std::string - Matthew Flaschen
2个回答

6

你不能像那样给数组分配指针。以下是使其正常工作的一种方法。

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++中,与其使用字符数组和指针,你最好使用字符串或向量。

*在类定义后面,你还需要加上分号。

这里是更符合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;
}

1
是的,您可以像使用数组一样(使用[])访问字符串中的单个字符。如果您有string str =“abc”;,那么str [0]将给出第一个字母(a),str [1]将给出第二个字母,依此类推... - Mysticial
1
你的C++老师是否给你使用char数组的理由?如果没有,那么你将如何知道何时使用它们? - David Schwartz
2
听起来,你最好的C++学习方法就是停止听那位老师的讲解,转而阅读一本好书! - Kerrek SB
@Matthew Flaschen:你说得对,我刚刚用strncpy替换了它。 - Mysticial
3
使用Mysticial的strcpy建议。你的老师鼓励你玩弄数组和指针是正确的。一旦你熟悉了C语言的低级数组和指针,你就会理解为什么像std::string这样的高级C++特性很有用,并知道何时使用它们。 - James Brock
显示剩余7条评论

0

你不需要在每个 desk 的引用前加上 room:: 前缀。

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

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

使用上述方法,这样你就可以安全地更改 desk 的大小。

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


1
请看我对Mystical答案的评论,了解为什么这个有问题。 - Matthew Flaschen
通过确保始终存在一个null值来解决问题。 - Jeremiah Gowdy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接