C ++, как объявить структуру в заголовочном файле - PullRequest
22 голосов
/ 29 апреля 2010

Я пытался включить структуру с именем "student" в файл 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 

Оказывается, компилятор (VC ++) не распознает struct Student из "student.h"?

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

Ответы [ 7 ]

26 голосов
/ 29 апреля 2010

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

student.h

#include <iostream>

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

student.cpp

#include "student.h"

struct Student student;
19 голосов
/ 29 апреля 2010

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

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

РЕДАКТИРОВАТЬ: конечно, после исправления проблемы включения охранника, вам также необходимо заполнить объявление студента в заголовочном файле. Как указывалось другими, предварительное заявление недостаточно в вашем случае.

17 голосов
/ 29 апреля 2010

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

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

16 голосов
/ 09 июля 2013

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

Поместите это в файл с именем 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; в заголовочный файл C ++, поскольку вы можете вызывать конфликты имен в разных библиотеках. Чтобы исправить это, используйте полное имя: std::string foobarstring; вместо включения пространства имен std с string foobarstring;.

4 голосов
/ 29 апреля 2010

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

2 голосов
/ 29 января 2014

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

  1. Вам необходимо включить файл заголовка в файл класса

  2. Никогда, НИКОГДА не размещайте директиву using внутри заголовка или класса, скорее делайте что-то вроде std :: cout << "say stuff"; </p>

  3. Структуры полностью определены в заголовке, структуры, по сути, являются классами, по умолчанию открытыми

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

1 голос
/ 09 июля 2013

Вы не можете.

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

...