我是否在头文件中正确地创建了一个对象?

Am I creating an object correctly in the header file?

所以我正在尝试使用 classes 来做一个链表。我从未在 C++ 上使用过 classes。我想要做的只是在头文件中创建一个 class 语法的对象。

我想访问 .cpp 文件上的 primeraPalabra 以供以后使用。我无法创建对象。

我得到的错误是:"primeraPalabra" 的多重定义。

我也不熟悉头文件和 cpp 文件的使用。任何提示表示赞赏。

palabra.h 文件

#ifndef PALABRA_H_INCLUDED
#define PALABRA_H_INCLUDED

#include <iostream>
using namespace std;


class Palabra{
    private:
    int p_id;
    string p_nombre;
    int p_valor;

    Palabra *next;
    Palabra *prev;


public:
    Palabra(int id, string nombre);
    void printNombre();
    int calcularValorPalabra();

    void agregarSiguiente(Palabra *);
    void eliminar();
    void buscar();
};

Palabra primeraPalabra(0,"");
Palabra ultimaPalabra(0, "");
Palabra palabraTemp(0, "");


#endif // PALABRA_H_INCLUDED

palabra.cpp 文件

Palabra::Palabra(int id, string nombre)
    {
    p_id = id;
    p_nombre = nombre;
    p_valor = calcularValorPalabra();

    next = NULL;
    prev = NULL;
}

如果您想创建对象的实例,则应在需要的地方进行。现在让我们假设这将在 main 中完成。

创建了一个名为:main.cpp

的新文件

里面有以下内容:

#include "Palabra.h"
int main() 
{
 Palabra palabra_one(0, ""); 
 return 0; 
}
Palabra primeraPalabra(0,"");
Palabra ultimaPalabra(0, "");
Palabra palabraTemp(0, "");

这在您的头文件中定义并实例化了三个对象。每一个包含这个头文件的.cpp都会定义这三个对象。您显然有多个 .cpp 个文件;所以这就是你的编译器和链接器最终向你咆哮的多重定义错误。

一个#include在逻辑上等同于将头文件逐字的内容插入到.cpp 文件。从头文件中删除这些定义,并手动将它们添加到包含此头文件的每个 .cpp 文件中,您将得到相同的错误。

您需要在头文件中使用 extern 关键字 声明 这些对象。然后,定义这些对象在正好是你的一个 .cpp 个文件,您认为在哪个文件中定义它们更合适。

你的 C++ 书应该有很多做这种事情的例子,以及如何使用 extern 关键字。

P.S。那using namespace std;,在你的头文件里也不少,is going to give you a world of hurt迟早会。你需要摆脱它。因为,你解释说,你才刚刚开始学习 C++,所以这是你避免染上坏习惯的最佳时机。暂时忘记 "using namespace std;" 存在于 C++ 中,直到您完全理解它的作用。一开始这似乎很烦人,但不久之后您甚至不会有意识地意识到您的手指在每个模板、class 和 C++ 库函数之前自动键入 std:: .

Palabra primeraPalabra(0,"");
Palabra ultimaPalabra(0, "");
Palabra palabraTemp(0, "");

给定 header 文件的严重问题可以在以下几行中看到。您正在 header 文件

中创建 class 的 3 实例

首先,我们应该问问自己:"What is a header file?" 假设您有许多函数声明并且您的程序有许多不同的 classes 和结构定义。好吧,一种选择是将它们全部放入 .cpp 文件中。好吧,那会非常混乱,代码也不会那么模块化。我们应该问自己的问题是:"How can we seperate our function & methods definitions & declarations and classes & structs definitions into different & unique files?"

毫不奇怪,header 文件可以帮助我们。

假设您有 2 个 classes A 和 B,并且您希望将它们的声明和定义分离到不同的文件中。 这是执行此操作的常规方法: A.h - 将包含 声明的文件 仅与 A 相关 A.cpp - 将包含 实现 中声明的函数和方法的文件 A.h B.h - 一个文件将包含 声明 仅与 A 相关** B.cpp - 将包含 实现 中声明的函数和方法的文件 B.h

有人可能会问:"How would you use the functions and methods declared in header files?" 为了在您的源代码中 包含 一个 header 文件,您可以在 C/C++ 代码

上方键入以下内容
#include "filename.h"

************** 额外说明 ************** 在有人在评论中对我尖叫之前 - 是的,模板函数实现应该在 header 文件中而不是在 cpp 文件中 如果您不知道什么是模板 - https://en.wikipedia.org/wiki/Template_(C%2B%2B)(额外 material) 但这是一个完全不同的话题 ************** 附加说明 **************

如何编译??????? 那么,在编译和最终可执行文件之间有一个称为 linking 的中间阶段。 一个 linker 负责组合所有指定的已用 header 文件;您可以在此处阅读有关链接过程的更多信息:https://en.wikipedia.org/wiki/Linker_(computing)

结论-代码中的问题

您基本上写了用于在 a [=92] 中创建 class 的 3 实例 的代码行=] 文件。 这些行完全不合适,可能是偶然写在那里的,但是,由于您指定您是 header 工作方式的新手,所以这是一个一般性介绍,其中包含一些 buzz-words 您可以随意google。有什么问题可以在评论里问我哦!