C++ 为什么我需要在标头中提供构造函数实现?C++;

C++ 为什么我需要在标头中提供构造函数实现?C++;,c++,class,constructor,header,undefined-reference,C++,Class,Constructor,Header,Undefined Reference,我正在main.cpp中创建一个对象,如下所示: #include <string> #include "class.hpp" std::string param = "name"; int main(){ Class object(param); } #pragma once class Class { public: std::string name; Class(std::string name) { this->name

我正在main.cpp中创建一个对象,如下所示:

#include <string>
#include "class.hpp"

std::string param = "name";

int main(){
     Class object(param);
}
#pragma once

class Class {
public:
    std::string name;
    Class(std::string name) {
        this->name = name;
    }
};
但是,在执行此操作时,我收到:

undefined reference to `Class::Class(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>)'
它起作用了。但是现在我的hpp和cpp文件是相同的,除了class.cpp顶部的include语句


我的问题是,这种做法不好吗?这似乎是多余和错误的。我错过了什么?为什么我需要将构造函数的实现放在标题中?

您声明了两个同名的类,您的cpp完全错误。它不包含在hpp文件中声明的构造函数的实现,它声明了另一个类及其实现。main.cpp包含hpp文件并查找不存在的实现

所以一开始不要使用保留关键字作为名称! test.hpp:

#pragma once
#include <string>
class Test{
public:
    std::string name;
    Test(std::string name);
};

在cpp文件中,您不必两次声明类,只有构造函数实现应该在那里

“为什么我需要将构造函数的实现放在头中?”您不需要。请告诉我们您是如何编译/链接代码的。您不能命名类
class
。在第一个示例中,您声明了两次
class
(可能没有编译cpp文件)。不要那样做。(请不要给类命名
class
,这完全令人困惑。)什么编译器允许您使用class关键字作为类的名称OThis不能在clang、gcc和MSVC上编译,因为
关键字的使用无效。您使用了什么编译器?
#pragma once

class Class {
public:
    std::string name;
    Class(std::string name) {
        this->name = name;
    }
};
#pragma once
#include <string>
class Test{
public:
    std::string name;
    Test(std::string name);
};
#include "test.hpp"

Test::Test(std::string name)
{
    this->name = name;
}