【问题标题】:c++ " undefined reference to 'Foo::Foo(std::string)' "c++ "未定义的对'Foo::Foo(std::string)'的引用"
【发布时间】:2011-04-09 00:51:03
【问题描述】:

我不太熟悉 c++ 以及实例化对象的工作原理,所以这可能是一个很容易解决的问题。当我使用 g++ 编译时,我收到错误“未定义对 'Foo::Foo(std::string)' 的引用”。我想创建一个类 Foo 的实例,它的构造函数中有一个字符串参数。代码如下:

Foo.h

#include <string>
using namespace std;

class Foo
{
    public:
        Foo(string s);

    private:
        string id;
};

Foo.cpp

#include <string>
#include "Foo.h"
using namespace std;

Foo::Foo(string s)
{
    id = s;
}

main.cpp

#include <string>
#include "Foo.h"
using namespace std;

int main()
{
    Foo foo("bar");

    return 0;
}

【问题讨论】:

  • 请不要在头文件中使用 using。此外,std::string 应该作为 foo(std::string const &s) 传递。
  • 对不起,为什么不在头文件中使用'using'?
  • 因为在头文件中使用会在包含头文件的每个编译单元中使用“using”-types 污染全局命名空间

标签: c++ undefined-reference


【解决方案1】:

您可能没有在编译行中包含 Foo.cpp。它应该看起来像这样:

g++ main.cpp Foo.cpp -o testFoo

【讨论】:

  • 嗯,这是我用我不熟悉的语言编译命令行的教训;感谢您节省了我更多的时间来寻找这个:)
【解决方案2】:

与您遇到的问题无关,但请考虑进行一些小的更改:

  1. 在 const 引用中传递参数。 const,因为您不打算更改参数和引用的值,因此您不会创建任何额外的临时对象。

  2. C++ 有一个初始化概念,它比在构造函数主体中对成员 'id' 使用赋值运算符更有效。当前版本的构造函数将调用成员 id 的默认构造函数,然后调用其赋值构造函数。初始化概念(即 'id(s)')只会调用一种方法,即复制构造函数。

    Foo::Foo(const string& s) : id(s)
    {
    }

【讨论】:

  • 初始化器的概念很有意思,感谢您的建议。
猜你喜欢
  • 2014-01-28
  • 2012-09-28
  • 2013-11-17
  • 2017-03-07
  • 2016-06-11
  • 1970-01-01
  • 1970-01-01
  • 2014-01-11
  • 2018-10-18
相关资源
最近更新 更多