Объявить структуру в файле заголовка и реализовать в исходном файле

#c

#c

Вопрос:

Всякий раз, когда я пытаюсь реализовать свою структуру в моем product.cpp файл, я не могу создать экземпляр объекта, потому что я получаю следующую ошибку «недопустимое использование неполного типа». Временным решением было реализовать мою структуру в самом файле product.hpp. Есть ли какой-либо способ объявить структуру в файле product.hpp и реализовать ее в product.cpp ?

Мой проект

Main.cpp

 #include <iostream>
#include "product.hpp"

using namespace std;

int main()
{
    product* p1 = novo_produto("tangerina", 5, 1.4);

    cout << "Nome produto: " << p1->nome << endl;
    cout << "Preco: " << p1->price << endl;
    cout << "Peso: " << p1->peso << endl;

    return 0;
}
  

product.hpp

 #ifndef PRODUCT_H
#define PRODUCT_H
#endif // PRODUCT_H

#include<iostream>
struct product
{
    int price;
    std::string nome;
    float peso;
};

typedef struct product Product;


// metodos

Product* novo_produto(std::string nome, float price, float peso);
  

product.cpp

 #include <iostream>
#include <malloc.h>
#include "product.hpp"

using namespace std;

Product* novo_produto(string nome, float price, float peso)
{
    Product* p = (Product*)malloc(sizeof(Product));

    p->nome = nome;
    p->price = price;
    p->peso = peso;

    return p;

}
  

Комментарии:

1. Не используйте malloc в C .

2. Я думаю, вам нужно показать свою среду сборки. Как вы компилируете и создаете свой проект? Если вы используете gcc /makefile / cmake, тогда покажите нам файлы команд или конфигурации.

3. Ваш typedef указывает, что вы пришли из C. Вам это не нужно в C . Просто вызовите свою структуру Product . Также ваш код ЗАВЕРШИТСЯ ошибкой, потому что вы malloc используете нетривиальную структуру. Следовательно, конструкторы его членов вызываться не будут.

4. Да, есть способ объявить структуру в product.hpp и реализовать ее в product.cpp , но это, вероятно, не то, что вы хотите. Почему вы хотите это сделать?

5. (Product*)malloc(sizeof(Product)); неверно в C , потому что это фактически не создает Product . Вместо этого эквивалентом C было бы new Product; . Но даже это должно быть заменено на std::make_unique<Product>(); в современном коде C . Но даже это , вероятно, здесь не требуется. В этом случае, вероятно, лучше просто использовать Product p; и использовать семантику значений.

Ответ №1:

Есть много ошибок. Давайте начнем с product.h файла. Прежде всего, вы устанавливаете защиту от множественного включения. Но вам нужно поместить свой код между #ifndef и #endif блоком. Затем вам нужно включить строку вместо iostream . Кроме того, в C вам не нужно объявлять typedef, чтобы использовать имя структуры в качестве ключевого слова, как в C. Таким образом, правильный файл product.h будет выглядеть следующим образом.

 #ifndef PRODUCT_H
#define PRODUCT_H

#include <string>


struct Product
{
    int price;
    std::string nome;
    float peso;
};

// metodos

Product* novo_produto(std::string nome, float price, float peso);

#endif // PRODUCT_H 
  

Давайте продолжим с product.cpp файлом. Прежде всего malloc объявляется в stdlib.h , а не в malloc.h . Однако, как упоминалось в комментариях, не используйте malloc в C . используйте new оператор или интеллектуальный указатель. Тогда ваш product.cpp файл будет таким;

 #include <iostream>
#include "product.h"
#include <memory>
   
using namespace std;
Product* novo_produto(string nome, float price, float peso) {
    
    Product* p = new Product;
    p->nome = nome;
    p->price = price;
    p->peso = peso;
    return p;

}
  

Последний файл main.cpp . Если вы используете оператор new для создания объекта, то вам нужно использовать delete оператор, чтобы избежать утечки памяти.

 #include <iostream>
#include "product.h"

using namespace std;
int main()
{
    Product* p1 = novo_produto("tangerina", 5, 1.4);

    cout << "Nome produto: " << p1->nome << endl;
    cout << "Preco: " << p1->price << endl;
    cout << "Peso: " << p1->peso << endl;

    delete p1;

    return 0;
}
  

Тогда результат будет;

 Nome produto: tangerina
Preco: 5
Peso: 1.4
  

Кроме того, для получения более подробной информации, пожалуйста, обратитесь к объявлениям классов, operator new и operator delete .

Комментарии:

1. Я очень благодарен всем за сотрудничество, этот ответ очень помог мне во многих трудностях.