You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++ Book类构造函数传入字符串为空问题及编译链接疑问

问题解答:Book类成员为空及编译链接疑问

一、Book类构造后成员为空的原因及修复

核心问题

你的代码里存在头文件内联函数覆盖cpp实现的问题:

  1. classes.h中给构造函数、setter、getter都写了空的内联实现(带{};),编译器会优先使用这些内联代码,完全忽略classes.cpp里的正确实现——相当于你写的setAuthor/setTitle调用根本没执行。
  2. 头文件里的空setter函数不会修改成员变量,自然输出空字符串。

修复步骤

  1. 修改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);
    };
    
  2. 保留classes.cpp的实现不变
    这里的构造函数和setter逻辑是正确的,只要头文件没有冲突的内联实现,就能被正常调用。

  3. 修正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;
    }
    
  4. 编译时链接所有文件
    比如用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 13:55:18