簡體   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