Подтвердить что ты не робот

С++, как объявить структуру в файле заголовка

Я пытаюсь включить структуру, называемую "ученик" в файл student.h, но я не совсем уверен, как это сделать.

Мой student.h код файла состоит из полностью:

#include<string>
using namespace std;

struct Student;

в то время как файл student.cpp состоит из целиком:

#include<string>
using namespace std;

struct Student {
    string lastName, firstName;
    //long list of other strings... just strings though
};

К сожалению, файлы, использующие #include "student.h", вызывают многочисленные ошибки, например

error C2027: use of undefined type 'Student'

error C2079: 'newStudent' uses undefined struct 'Student'  (where newStudent is a function with a `Student` parameter)

error C2228: left of '.lastName' must have class/struct/union 

Кажется, компилятор (VС++) не распознает struct Student из "student.h" ?

Как я могу объявить struct Student в "student.h" , чтобы я мог просто # включить "student.h" и начать использовать struct?

4b9b3361

Ответ 1

Вы не должны размещать директиву using в файле заголовка, это может дать вам проблемы в будущем.

Также вам нужно включить охрану в свой заголовок.

EDIT: конечно, после исправления проблемы с защитой включения, вам также нужно полное объявление студента в файле заголовка. Как указано другими, в вашем случае недопустимой декларации недостаточно.

Ответ 2

Попробуйте этот новый источник:

student.h

#include <iostream>

struct Student {
    std::string lastName;
    std::string firstName;
};

student.cpp

#include "student.h"

struct Student student;

Ответ 3

Ваш файл student.h только вперед объявляет структуру с именем "Студент", она не определяет ее. Этого достаточно, если вы ссылаетесь только на ссылку или указатель. Однако, как только вы попытаетесь использовать его (включая создание одного), вам понадобится полное определение структуры.

Короче говоря, переместите вашу структуру Student {...}; в файл .h и использовать файл .cpp для реализации функций-членов (которых у него нет, поэтому вам не нужен файл .cpp).

Ответ 4

С++, как объявить структуру в файле заголовка:

Поместите это в файл main.cpp:

#include <cstdlib>
#include <iostream>
#include "student.h"

using namespace std;    //Watchout for clashes between std and other libraries

int main(int argc, char** argv) {
    struct Student s1;
    s1.firstName = "fred"; s1.lastName = "flintstone";
    cout << s1.firstName << " " << s1.lastName << endl;
    return 0;
}

поместите это в файл с именем student.h

#ifndef STUDENT_H
#define STUDENT_H

#include<string>
struct Student {
    std::string lastName, firstName;
};

#endif

Скомпилируйте его и запустите, он должен произвести этот вывод:

s1.firstName = "fred";

Protip:

Вы не должны размещать директиву using namespace std; в заголовочном файле С++, потому что вы можете столкнуться с молчаливыми именами между разными библиотеками. Чтобы исправить это, используйте полное имя: std::string foobarstring; вместо того, чтобы включать пространство имен std с string foobarstring;.

Ответ 5

У вас есть только объявление вперед для student в файле заголовка; вам нужно поместить объявление структуры в файл заголовка, а не в .cpp. Определения метода будут в .cpp(если у вас есть).

Ответ 6

Хорошо, что три больших вещи я заметил

  • Вам нужно включить заголовочный файл в файл класса

  • Никогда, НИКОГДА не размещайте директиву using внутри заголовка или класса, скорее сделайте что-то вроде std:: cout < "сказать вещи";

  • Структуры полностью определены внутри заголовка, структуры - это, по существу, классы, которые по умолчанию являются общедоступными

Надеюсь, это поможет!

Ответ 7

Вы не можете.

Чтобы "использовать" структуру, т.е. чтобы иметь возможность объявлять объекты этого типа и получать доступ к своим внутренним элементам, вам нужно полное определение структуры. Таким образом, вы хотите сделать что-либо из этого (и вы, судя по сообщениям об ошибках), вы должны поместить полное определение типа структуры в заголовочный файл.