如何在类外声明结构时返回类中的结构?



我试图得到字符串的结构"Johna"Smith"通过调用类返回。我对OOP和指针非常陌生和困惑,我想知道我是否在正确的轨道上,我能做些什么来摆脱以下错误:

  1. 无法将' name '转换为' const char* ' "第46行……这条线
printf(s1.get_name())

任何帮助是感激的,这里是完整的代码

#include <stdio.h>
#include <algorithm>  // for std::find
#include <cctype>
#include <ctime>
#include <iostream>
#include <iterator>  // for std::begin, std::end
#include <vector>
using namespace std;
enum year { FRESHMAN, SOPHOMORE, JUNIOR, SENIOR };
struct name {
string firstName;
string lastName;
};
class Student : name {
private:
name Name;
public:
void setname(string fn, string ln) {
Name.firstName = fn;
Name.lastName = ln;
}
name get_name() { return Name; }
};
int main() {
Student s1;
s1.setname("johna", "smith");
printf(s1.get_name()) return 0;
}

你的代码完全没问题,你只是对c++的printf函数感到困惑。也许你有使用python、javascript或其他脚本语言的经验,print函数可以接受任何内容并很好地打印出来。而像c++这样的强类型语言则不是这样。

你应该阅读有关打印的文档。

name s1_name = s1.get_name();
printf("%s %sn", s1_name.firstName.c_str(), s1_name.lastName.c_str());

或者,您可以使用std::cout,它将为您处理格式类型。

std::cout << s1_name.firstName << ' ' << s1_name.lastName  << 'n';

你也可以定义一种方法让std::cout知道如何处理你的结构:


struct name
{
string firstName;
string lastName;
friend std::ostream& operator <<(ostream& os, const name& input)
{
os << input.firstName << ' ' << input.lastName << 'n';
return os;
}
};
...
std::cout << s1_name;

添加到恶魔发布的内容,当您不提供格式说明符作为printf的第一个参数时,它为潜在的格式字符串漏洞打开了空间。因为您没有指定第一个参数的格式,如果程序的用户能够将Name的内容更改为%x %x %x %x,则用户将能够从堆栈中读取内存并泄漏信息,这可能导致大量问题。在使用printf:)

时,请确保始终使用%s或%d等格式说明符来避免这些问题

最好是在c++中使用cout

printf(s1.get_name())

应该

cout << s1.get_name();

相关内容

  • 没有找到相关文章

最新更新