practice.h
struct CandyBar
{
string name;
double weight;
int calories;
};
practice.cpp
#include <iostream>
#include <string>
#include "practice.h"
using namespace std;
int main()
{
CandyBar snacks{ "Mocha Munch", 2.3, 350 };
cout << snacks.name << "\t" << snacks.weight << "\t" << snacks.calories << endl;
return 0;
}
когда я создаю решение, я получаю ошибки:
practice.h(5): error C2146: syntax error : missing ';' before identifier 'name'
practice.h(5): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
error C2440: 'initializing' : cannot convert from 'const char [12]' to 'double'
There is no context in which this conversion is possible
practice.cpp(20): warning C4244: 'initializing' : conversion from 'double' to 'int', possible loss of data
practice.cpp(20): error C2078: too many initializers
practice.cpp(22): error C2039: 'name' : is not a member of 'CandyBar'
practice.h(4) : see declaration of 'CandyBar'
что является причиной всех ошибок? почему переменные не будут распознаны как поля структуры?
Проблема заключается в том, что когда синтаксический анализатор заголовков не содержит строки типа.
Лучший способ - включить пространство имен, например
struct CandyBar
{
std::string name;
double weight;
int calories;
};
Это не отображается в файле cpp, поскольку вы using namespace std;
Вы можете поместить используемую строку перед #include "practice.h", но это считается плохим стилем, поскольку заголовок теперь не является самодостаточным, и у вас могут возникнуть конфликты пространства имен.
#include <string>
и пространство имен std в файле cpp, почему я должен делать std :: string?
Включение не требуется, но вы должны либо импортировать пространство имен std
либо полностью квалифицировать его использование. Поэтому либо повторите оператор using
либо объявите name
как тип std::string
.
Вам нужно включить на практике.h.
Вот так:
#include <string>
struct CandyBar
{
std::string name; // And also std:: before string, as Praetorian pointed out
double weight;
int calories;
};
string
уже включена в точку, где анализируется заголовок.
Вы должны использовать "#ifndef", "#define". Потому что, возможно, заголовочные файлы могут вызывать для инициализации несколько раз. Поэтому вы принимаете ошибки. Посмотрите: С++ ta Отдельная компиляция II - Файл заголовка Kullanmak
#include <string>
иstd::
передstring name;
в шапке. Редактировать: не заметил, что вы включаете<string>
перед тем, как включить заголовок в ваш исходный файл, поэтому он должен работать и без оператора include, но все же стоит добавить оператор include в заголовок, так как он зависит наstd::string
. Иusing namespace std;
это очень плохая практика!using namespace std;
был в файле * .cpp, а не в заголовке.