C++ 问题返回 object 通过引用在本地创建

C++ Issue returning object created locally via reference

请多多包涵。我一直在学习 Google Education C++ 课程,目前正在学习 Database Project。该程序的想法是我们创建一个数据库 object,该数据库又包含一组作曲家 object。这些 composer objects 包含通过 setter 和 getter 访问的属性和信息。我们获得了 header 文件以及两个测试实施文件,我们需要实施 header 定义。

问题是,如果我错了请指正,我们被要求定义以下header声明:

Composer& AddComposer(string in_first_name, string in_last_name,
                    string in_genre, int in_yob, string in_fact);

这涉及在函数内本地创建一个 Composer object,将其添加到一个 Composer 数组,然后 return 引用该单个 Composer object。据我了解,本地 Composer object 在函数 return 上被释放,并且该引用本质上不会引用任何内容。我的第一个问题是,在 AddComposer 中创建的 Composer object 可以 return 编辑作为参考吗?如果可以,应该吗?

我对 AddComposer 的实现如下:

Composer& Database::AddComposer(string in_first_name, 
                                string in_last_name,
                                string in_genre, 
                                int in_yob, 
                                string in_fact) {

    // Creating a new composer object
    Composer composer;

    composer.set_first_name(in_first_name);
    composer.set_last_name(in_last_name);
    composer.set_composer_yob(in_yob);
    composer.set_composer_genre(in_genre);
    composer.set_fact(in_fact);

    // Adding the newly created composer object to the composers_ array
    composers_[next_slot_] = composer;

    // Increment the next_slot_ counter
    next_slot_ ++;

    return composers_[(next_slot_-1)];
}

我改为尝试 return 来自 composers_ 数组的 object 作为其全局定义。此代码仍然会产生错误:

C:\Users\jprestid\AppData\Local\Temp\ccnMv1rz.o:test_database.cpp:(.text+0x1a8): undefined reference to `Composer::Promote(int)'
c:/Program Files/mingw-w64/x86_64-4.9.2-posix-seh-rt_v3-rev1/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/4.9.2/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\jprestid\AppData\Local\Temp\ccnMv1rz.o: bad reloc address 0x10 in section `.xdata'
collect2.exe: error: ld returned 1 exit status

Promote() 是在 Composer object return 上从 AddComposer() 函数调用的第一个函数。

我的代码库在 Github 上在线,我们将不胜感激。这个问题困扰了我一整天!抱歉我 post 的尺寸,再次感谢,

贾维斯

编辑:这是一个编译问题,我没有包含必要的文件 composer.cpp,正如宏 A 所指出的那样。我觉得很傻。谢谢大家

我下载了你的代码并在 Windows 机器上用 mingw64 编译了它:它工作正常。

未定义的引用(如评论中确认的那样)是由于您没有在编译行中包含所有 cpp 文件造成的。

g++ test_database.cpp database.cpp composer.cpp -o test