首页 > 解决方案 > 为什么我需要在 header 中提供构造函数实现?C++

问题描述

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

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

std::string param = "name";

int main(){
     Class object(param);
}

类.cpp:

#include <string>

class Class {
public:
    std::string name;
    Class(std::string name) {
        this->name = name;
    }
};

类.hpp:

#pragma once

class Class {
public:
    std::string name;
    Class(std::string name);
};

但是,这样做时,我会收到:

undefined reference to `Class::Class(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>)'

但是,如果我将构造函数实现放在这样的标题中:

#pragma once

class Class {
public:
    std::string name;
    Class(std::string name) {
        this->name = name;
    }
};

有用。但是现在我的 hpp 和 cpp 文件是相同的,除了我在 class.cpp 顶部的 include 语句。

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

标签: c++classconstructorheaderundefined-reference

解决方案


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

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

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

测试.cpp:

#include "test.hpp"

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

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


推荐阅读