cpp代码People::People(char* name, int age) : m_name(name), m_age(age) {} 后面People* p = new People("王志刚", 23);为什么报错?
时间: 2024-03-30 18:34:47 浏览: 12
这段代码可能报错的原因有很多,没有具体的错误信息很难确定。但是,根据代码片段来看,有可能出现以下几个问题:
1. 在使用 char* 类型作为字符串时,需要保证字符串以 '\0' 结尾。如果 name 没有以 '\0' 结尾,就会导致出现未知错误。
2. 如果 m_name 是一个 const char* 类型,那么需要使用字符串常量来初始化它,而不能使用 char* 类型的指针变量。
3. 如果 m_name 是一个 std::string 类型,那么需要将 char* 类型转换为 std::string 类型。
4. 如果 m_age 是一个 const int 类型,则需要在构造函数初始化列表中进行初始化,因为 const 类型的成员变量无法在构造函数中赋值。
总之,需要进一步分析具体的错误信息才能确定问题所在。
相关问题
Person类的结构如图所示,包含姓名,身份证号,性别,年龄四个成员数据,以及构造函数,析构函数,显示信息函数。 要求在此基础上派生出Employee类,该类新增两个数据成员,分别为部门和薪水,Employee包含构造函数,析构函数,显示函数。 请1)完成Person类的各成员函数,2)完成Employee类的定义以及Employee各成员函数的定义。 class Person{ protected: char *name; char *id; int sex; ///0:女,1:男 int age; public: Person(char *p_name,char *p_id,int p_sex,int p_age); void show(); ~Person(); };
1)完成Person类的各成员函数:
```cpp
#include <iostream>
#include <cstring>
using namespace std;
class Person{
protected:
char *name;
char *id;
int sex; // 0:女,1:男
int age;
public:
Person(char *p_name,char *p_id,int p_sex,int p_age){
name = new char[strlen(p_name)+1];
strcpy(name, p_name);
id = new char[strlen(p_id)+1];
strcpy(id, p_id);
sex = p_sex;
age = p_age;
}
void show(){
cout<<"姓名:"<<name<<endl;
cout<<"身份证号:"<<id<<endl;
cout<<"性别:"<< (sex==1?"男":"女") <<endl;
cout<<"年龄:"<<age<<endl;
}
~Person(){
delete[] name;
delete[] id;
}
};
```
2)完成Employee类的定义以及Employee各成员函数的定义:
```cpp
class Employee: public Person{
private:
char *department;
int salary;
public:
Employee(char *p_name,char *p_id,int p_sex,int p_age, char *p_department, int p_salary)
:Person(p_name, p_id, p_sex, p_age){
department = new char[strlen(p_department)+1];
strcpy(department, p_department);
salary = p_salary;
}
void show(){
Person::show();
cout<<"部门:"<<department<<endl;
cout<<"薪水:"<<salary<<endl;
}
~Employee(){
delete[] department;
}
};
```
std::string 中文转char* 乱码
将包含中文字符的 `std::string` 转换为 `char*` 时,可能出现乱码问题。这是因为 `std::string` 内部使用的是 `char` 类型,而大部分编译器默认使用的是 ASCII 编码,无法正确处理中文字符。
要解决这个问题,您可以使用多字节字符集(Multibyte Character Set)的函数来进行转换。以下是一个示例代码,演示如何将包含中文字符的 `std::string` 转换为 `char*`:
```cpp
#include <iostream>
#include <string>
#include <vector>
#include <Windows.h>
int main() {
std::string str = "中文字符串";
int size_needed = MultiByteToWideChar(CP_UTF8, 0, str.c_str(), -1, NULL, 0);
std::vector<wchar_t> buffer(size_needed);
MultiByteToWideChar(CP_UTF8, 0, str.c_str(), -1, buffer.data(), size_needed);
int size_needed_mb = WideCharToMultiByte(CP_ACP, 0, buffer.data(), -1, NULL, 0, NULL, NULL);
std::vector<char> buffer_mb(size_needed_mb);
WideCharToMultiByte(CP_ACP, 0, buffer.data(), -1, buffer_mb.data(), size_needed_mb, NULL, NULL);
char* converted_str = buffer_mb.data();
std::cout << converted_str << std::endl;
return 0;
}
```
上述代码中,使用了 `MultiByteToWideChar` 函数来将 `std::string` 中的 UTF-8 字符串转换为宽字符 `wchar_t`,然后再使用 `WideCharToMultiByte` 函数将宽字符转换为多字节字符,在这里使用的是系统默认的 ANSI 编码(CP_ACP)。最终得到的 `char*` 类型的转换后字符串 `converted_str` 可以正常输出中文字符。
需要注意的是,这里的示例代码是在 Windows 平台下使用的,如果您在其他平台下开发,可能需要使用不同的函数和编码方式进行转换。请根据您的开发环境和需求进行适当的调整。
希望这能帮助到您!如有任何进一步的问题,请随时提问。