繁体   English   中英

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

[英]Am I creating an object correctly in the header file?

所以我试图用类来做一个链表。 我从未在 C++ 上使用过类。 我想要做的只是在头文件上创建类 palabra 的对象。

我想访问 .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;
}
Palabra primeraPalabra(0,"");
Palabra ultimaPalabra(0, "");
Palabra palabraTemp(0, "");

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

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

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

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

PS using namespace std; ,在你的头文件中,迟早会给你一个伤害的世界 你需要摆脱它。 因为,你解释说,你刚刚开始学习 C++,这是你避免养成坏习惯的最佳时机。 只需忘记“使用命名空间 std;” 目前存在于 C++ 中,直到您完全理解它的作用。 乍一看似乎很烦人,但用不了多久,您甚至不会有意识地意识到您的手指在 C++ 库中的每个模板、类和函数之前自动键入std::

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

创建了一个名为:main.cpp 的新文件

里面有以下内容:

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

给定头文件的一个关键问题可以在以下几行中看到。 您正在头文件中创建一个类的 3 个实例

首先,我们应该问自己:“什么是头文件?” 假设您有许多函数声明,并且您的程序有许多不同的类和结构定义。 好吧,一种选择是将它们全部放在一个.cpp文件中。 嗯,那会很乱,而且代码也不会那么模块化。 我们应该问自己的问题是:“我们如何将我们的函数和方法定义和声明以及类和结构定义分离到不同且唯一的文件中?”

不出所料,头文件可以帮助我们。

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

有人可能会问:“您将如何使用头文件中声明的函数和方法?” 为了在源代码中包含头文件,您可以在 C/C++ 代码上方键入以下内容

#include "filename.h"

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

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

结论——代码中的问题

您基本上编写了用于在头文件中创建类的3 个实例的行。 这些行完全不合适,可能是偶然写在那里的,但是,由于您指定您不熟悉标题的工作方式,因此这是一个一般性介绍,其中包含一些流行语,您可以随意谷歌搜索。 如果您有任何问题,请在评论中问我!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM