我是否在头文件中正确地创建了一个对象?
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。有什么问题可以在评论里问我哦!
所以我正在尝试使用 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。有什么问题可以在评论里问我哦!