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

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

мой 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 в "студент.h " так что я могу просто #включить "студент.h " и начать использовать структуру?

7 ответов


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

Также вам понадобится включить гвардии в заголовке.

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


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

студент.h

#include <iostream>

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

студент.cpp

#include "student.h"

struct Student student;

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

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


в 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;.


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


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

  1. вам нужно включить файл заголовка в свой файл класса

  2. никогда, никогда не размещайте директиву using внутри заголовка или класса, А сделайте что-то вроде std::cout

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

надеюсь, что это помогает!


ты не можешь.

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