C++ Book类构造函数传入字符串为空问题及编译链接疑问
问题解答:Book类成员为空及编译链接疑问
一、Book类构造后成员为空的原因及修复
核心问题
你的代码里存在头文件内联函数覆盖cpp实现的问题:
classes.h中给构造函数、setter、getter都写了空的内联实现(带{};),编译器会优先使用这些内联代码,完全忽略classes.cpp里的正确实现——相当于你写的setAuthor/setTitle调用根本没执行。- 头文件里的空setter函数不会修改成员变量,自然输出空字符串。
修复步骤
修改
classes.h,移除内联空实现
只保留函数声明,不要写{}:#include <iostream> #include <string> using namespace std; class book { private: string author; string title; public: // 仅声明构造函数,无内联实现 book(string* writer, string* title); string getAuthor(); string getTitle(); void setTitle(string name); void setAuthor(string name); };保留
classes.cpp的实现不变
这里的构造函数和setter逻辑是正确的,只要头文件没有冲突的内联实现,就能被正常调用。修正
main.cpp的main函数返回值
C++标准要求main函数必须返回int,修改后:#include "classes.h" using namespace std; int main() { string writer = "john"; string title = "lord of the rings"; string *ptr_writer = &writer; string *ptr_title = &title; book test1(ptr_writer,ptr_title); cout << test1.getAuthor() << endl; cout << test1.getTitle() << endl; return 0; }编译时链接所有文件
比如用GCC编译时,要把两个cpp文件一起传入:g++ main.cpp classes.cpp -o book_test
二、关于未链接classes.cpp却能编译的疑问
你觉得编译器“识别了类定义”,本质是两个阶段的工作差异:
- 编译阶段:
main.cpp通过#include引入了classes.h,编译器能从头文件里拿到book类的结构、函数签名等信息,这一步不需要classes.cpp。 - 链接阶段:因为你头文件里的函数都写了内联空实现(
{};),这些内联代码会直接嵌入到main.cpp的编译结果中,链接器不需要去classes.cpp找函数定义——但这也导致你写的正确实现完全没被用到。 - 如果你删掉头文件里的内联实现(只留函数签名),再单独编译
main.cpp,链接阶段就会报错,提示找不到函数定义,这时候就必须把classes.cpp一起编译链接才能运行。
内容的提问来源于stack exchange,提问作者Luke
相关产品推荐
相关产品推荐

