提问人:linx 提问时间:11/6/2023 最后编辑:Solomon Slowlinx 更新时间:11/6/2023 访问量:58
访问类的属性是另一个类的属性?[关闭]
Access property of class that is the property of another class? [closed]
问:
我正在尝试使用 C++,并希望从类中访问类的名称属性。.h 和 .cpp 文件的代码如下。Job
Player
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?
如果不是,错误是由其他原因引起的吗?
谢谢!
答:
代码中的问题在于如何初始化类的 name 成员。让我们一步一步地进行更正。Job
在类中,应使用而不是 for 字符串文字,并且需要在构造函数中正确初始化 name 成员。此外,这也是用于管理字符串的好做法。Job
const char*
char*
std::string
class Job {
public:
std::string name;
Job() = default;
Job(const char* jobName) : name(jobName) {}
};
同样,在类中,最好用于管理字符串。Player
std::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
评论
Job(const char* jobName)
应该是 .Job(const string& jobName)
评论
char*
name = name;
char*
只是一个指针。当您复制指针时,您没有复制它指向的字符串(尽管它在这里“有效”,因为您只使用字符串文字)strcpy()
strcat()
strcmp()
strchr()
strdup()
std::string