#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. Я очень благодарен всем за сотрудничество, этот ответ очень помог мне во многих трудностях.