c++ - 为什么我需要在 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 语句。
我的问题是,这是不好的做法吗?这似乎是多余和错误的。我在这里想念什么?为什么我需要将构造函数的实现放在标题中?
解决方案
您声明了 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 文件中,您不必两次声明类,应该只有构造函数实现
推荐阅读
- powershell - PowerShell StreamWriter 路径属性
- java - 如何使用 Spring Boot 实现 AWS Secret Manager?做这个的最好方式是什么?
- python - 按变量索引对数据框的一列进行分组
- javascript - 我可以使用 Babel 转译为 ES5 但保留导入/导出而不是 commonjs 吗?
- csv - 如何将 Octave 文件读入变量
- javascript - Vue ChatJS 在指针单击时重定向
- python - 使用多个 url 提取文本
- powershell - 使用 PowerShell 查找和替换二进制文件中的十六进制值
- javascript - 为什么开发人员在 JavaScript 中使用 get 和 set 时使用“_”?
- amazon-web-services - 查找windows server的全名