Я правильно создаю объект в заголовочном файле? - PullRequest
2 голосов
/ 15 марта 2020

Итак, я пытаюсь использовать классы для создания связанного списка. Я никогда не использовал классы на С ++. То, что я пытаюсь сделать, это просто создать объект класса palabra в заголовочном файле.

Я хочу получить доступ к primeraPalabra в файле. cpp для последующих методов. Я не могу создать объект.

Я получаю ошибку: множественное определение "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

файл Палабра. cpp файл

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

    next = NULL;
    prev = NULL;
}

Ответы [ 3 ]

2 голосов
/ 15 марта 2020
Palabra primeraPalabra(0,"");
Palabra ultimaPalabra(0, "");
Palabra palabraTemp(0, "");

Это в вашем заголовочном файле определяет и создает три объекта. Каждый .cpp, который включает этот заголовочный файл, будет определять эти три объекта. У вас очевидно есть несколько .cpp файлов; так что это ваша ошибка множественного определения, о которой ваш компилятор и компоновщик в конечном итоге лают.

#include логически эквивалентно вставке содержимого файла заголовка, дословно , в файл .cpp. Удалите эти определения из файла заголовка и вручную добавьте их в каждый файл .cpp, который включает этот файл заголовка, и вы получите ту же ошибку.

Вам необходимо объявить эти объекты, используя ключевое слово extern в вашем заголовочном файле. Затем определите этих объектов в ровно в одном из ваших .cpp файлов, в каком из них вы считаете более подходящим для их определения .

Ваша книга по С ++ должна содержать множество примеров того, как делать подобные вещи, и как использовать ключевое слово extern.

PS Что using namespace std;, в вашем заголовочном файле нет меньше, рано или поздно даст вам мир боли . Вы должны избавиться от этого. Поскольку, вы объясняете, вы только начинаете изучать C ++, это лучшее время для вас, чтобы избежать появления вредных привычек. Просто забудьте, что «используя пространство имен std;» существует в C ++, пока вы полностью не поймете, что он делает. Поначалу это может показаться раздражающим, но скоро вы даже не осознаете, как ваши пальцы автоматически набирают std:: перед каждым шаблоном, классом и функцией из библиотеки C ++.

0 голосов
/ 15 марта 2020
Palabra primeraPalabra(0,"");
Palabra ultimaPalabra(0, "");
Palabra palabraTemp(0, "");

Критическую проблему с данным файлом заголовка можно увидеть в следующих строках. вы создаете 3 экземпляра класса внутри заголовочного файла

Прежде всего, мы должны спросить себя: "Что такое заголовочный файл?" Предположим, у вас много объявлений функций, а в вашей программе много разных классов и определений структур. Ну, один из вариантов - поместить их все в файл . cpp. Ну, это было бы очень грязно, и код не был бы таким модульным. Вопрос, который мы должны задать себе: «Как мы можем разделить наши определения и объявления функций и методов, а также определения классов и структур в различных и уникальных файлах?»

Неудивительно, что заголовочные файлы могут помочь us.

Предположим, у вас есть 2 класса A & B, и вы sh хотите разделить их объявления и определения в разных файлах. Вот обычный способ сделать это: 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) (дополнительный материал) Но это совсем другие топи c ******** ****** Дополнительное примечание **************

Как это скомпилируется ????????? Ну, между Компиляция и финальный исполняемый файл - это промежуточный этап, называемый linking . компоновщик отвечает за объединение всех указанных файлов заголовков; Подробнее о процессе связывания вы можете прочитать здесь: https://en.wikipedia.org/wiki/Linker_ (вычисления)

Вывод - проблема в коде

Вы, по сути, написали строки для создания 3 экземпляров класса в файла заголовка . Эти строки совершенно неуместны и, вероятно, были написаны там случайно, однако, из-за того, что вы указали, что вы новичок в работе заголовка, это общее введение с несколькими модными словами, которые вы можете смело гуглить. Если у вас есть какие-либо вопросы, задавайте их в комментариях!

0 голосов
/ 15 марта 2020

Если вы хотите создать экземпляр объекта, это следует делать везде, где это необходимо. А пока давайте предположим, что это будет сделано в основном.

Создан новый файл с именем: main. cpp

Внутри есть следующее:

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