我要在头文件中正确创建对象吗?

问题描述 投票:1回答:3

因此,我正在尝试使用类来创建链接列表。我从未在c ++上使用过类。我想要做的只是在头文件上创建class 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;
}
c++ class object header-files
3个回答
1
投票
Palabra primeraPalabra(0,"");
Palabra ultimaPalabra(0, "");
Palabra palabraTemp(0, "");

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

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

您需要使用头文件中的extern关键字declare这些对象。然后,define将这些对象放在.cpp文件的确切地一个中,无论哪种感觉,您都更适合定义它们。

您的C ++书中应包含许多执行这种操作的示例,以及如何使用extern关键字。

P.S。头文件中的using namespace std;早晚是is going to give you a world of hurt。您需要摆脱它。因为您解释了,您才刚刚开始学习C ++,所以这是避免养成不良习惯的最佳时机。只需忘记“使用命名空间std;”即可。在您完全了解C ++的功能之前,它在C ++中暂时存在。乍一看似乎很烦人,但不久之后您甚至都不会意识到C ++库中的每个模板,类和函数之前自动输入std::的手指。


0
投票

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

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

里面有以下内容:

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

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

给定头文件的严重问题可以在以下几行中看到。您正在头文件内创建3个类的[[instances

首先,我们应该问自己:“什么是头文件?”假设您有许多函数声明,并且您的程序有许多不同的类和结构定义。好吧,一种选择是将它们全部放入

。cpp

文件中。好吧,那将是非常混乱的,并且代码也不会那么模块化。我们应该问自己的问题是:“如何将我们的函数和方法定义,声明以及类和结构定义分隔为不同和唯一文件?”不足为奇,头文件可以为我们提供帮助。

假设您有2个A和B类,并且希望将它们的声明和定义分成不同的文件。这是常规的方法:

A.h-仅包含与A相关的declarations

的文件A.cpp-包含A.h中声明的函数和方法的实现的文件B.h-将包含仅与A相关的declarations的文件**B.cpp-包含B.h中声明的函数和方法的实现的文件一个人可能会问:“您将如何使用头文件中声明的函数和方法?”为了在源代码中

include

头文件,您可以在C / C ++代码上方键入以下内容#include "filename.h"
**************附加说明**************在有人在评论中对我大喊之前-是的,模板函数实现应位于头文件中,而不应位于cpp文件中如果您不知道什么是模板-https://en.wikipedia.org/wiki/Template_(C%2B%2B)(其他材料)

但这是一个完全不同的主题

**************附加说明**************

那将如何编译?????????

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

结论-代码中的问题

您本质上写了几行来在

头文件中创建一个class的3个instances。这些行完全不合时宜,并且可能是偶然地写在那里的,但是,由于您指定您是头文件工作方式的新手,所以这是一个概述,其中包含一些时髦的词,您可以在Google上随意使用。如果您有任何疑问,请在评论中问我!

© www.soinside.com 2019 - 2024. All rights reserved.