访问类的属性是另一个类的属性?[关闭]

Access property of class that is the property of another class? [closed]

提问人:linx 提问时间:11/6/2023 最后编辑:Solomon Slowlinx 更新时间:11/6/2023 访问量:58

问:


这个问题似乎与帮助中心定义的范围内的编程无关。

16天前关闭。

我正在尝试使用 C++,并希望从类中访问类的名称属性。.h 和 .cpp 文件的代码如下。JobPlayer

Foo.h的

#include <iostream>  
#include <string>  
#include <vector>  
  
class Job {  
    public:  
        char* name = "";  

    Job() = default;  

    Job (char* name) {  
        name = name;  
    }  
};  
  
class Player {  
    public:  
        char* name = "";  
        char* id = "";  
        char* job_name = "";  
        Job job;  
  
        Player() = default;  
  
        Player(char* name, char* job_name) : name(name), job_name(job_name), job(job_name) {};  
};

Foo.cpp

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

int main() {
    Player player1("player1", "default");  
    std::cout << player1.job.name;  
}  

但是,我收到了以下错误。

在 Foo.exe 的 0x00007FFE5436F551 (ucrtbased.dll) 抛出异常:0xC0000005:访问冲突读取位置0x0000000000000000。

我怀疑该错误是由于我在 std::cout 上调用 player1.name 时调用 player1.job.name,但我不确定为什么这是不允许的/非法的。如果是这样,称呼 player1.job.name 的正确方式是什么?我应该使用 getter 来访问 Job() 类的属性吗?在这种情况下,我是否需要每个属性的 getter?我应该如何构建我的 getter 来调用嵌套属性?为什么不允许 player1.job.name?

如果不是,错误是由其他原因引起的吗?

谢谢!

C++ 对象

评论

4赞 Pepijn Kramer 11/6/2023
你为什么要使用字符串,这是 C++,所以使用 std::string。char*
0赞 463035818_is_not_an_ai 11/6/2023
stackoverflow.com/questions/388242/......
4赞 Evg 11/6/2023
你认为这是为什么?name = name;
0赞 463035818_is_not_an_ai 11/6/2023
char*只是一个指针。当您复制指针时,您没有复制它指向的字符串(尽管它在这里“有效”,因为您只使用字符串文字)
0赞 Thomas Matthews 11/6/2023
如果必须:、、、和 。它更简单,更不容易出错。strcpy()strcat()strcmp()strchr()strdup()std::string

答:

1赞 GustavoWoltmann1980 11/6/2023 #1

代码中的问题在于如何初始化类的 name 成员。让我们一步一步地进行更正。Job

在类中,应使用而不是 for 字符串文字,并且需要在构造函数中正确初始化 name 成员。此外,这也是用于管理字符串的好做法。Jobconst char*char*std::string

class Job {
public:
std::string name;
    
Job() = default;
    
Job(const char* jobName) : name(jobName) {}
};

同样,在类中,最好用于管理字符串。Playerstd::string

class Player {
public:
std::string name;
std::string id;
std::string job_name;
Job job;

Player() = default;

Player(const std::string& playerName, const std::string& jobName) 
: name(playerName), job_name(jobName), job(jobName) {}
};

在您的主要功能中,您可以毫无问题地访问。player1.job.name

int main() {
Player player1("player1", "default");
std::cout << player1.job.name << std::endl;
return 0;
}

通过进行这些更改,可以确保正确管理字符串数据,并且不会遇到访问无效内存位置的问题。使用时无需手动管理字符串的内存。std::string

如果您仍然想使用字符数组(C 字符串),则需要确保为它们正确分配内存并在整个程序中对其进行管理,但在现代 C++ 代码中使用通常更方便、更安全。std::string

评论

2赞 Evg 11/6/2023
Job(const char* jobName)应该是 .Job(const string& jobName)
0赞 starball 11/15/2023
出于好奇,你在写这篇回答帖时有没有使用任何生成式人工智能?