web-dev-qa-db-ja.com

C ++、ヘッダーファイルで構造体を宣言する方法

私はstudent.hファイルに "student"と呼ばれる構造体を含めようとしましたが、どうすればよいかよくわかりません。

私の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++)は、 "student.h"からstruct Studentを認識しないようです。

「student.h」でstruct Studentを宣言して、「#student.h」を#includeして、その構造体の使用を開始するにはどうすればよいですか?

22
wrongusername

ヘッダーファイルにusingディレクティブを配置しないでください。 不要な頭痛 が作成されます。

また、ヘッダーに ガードを含める が必要です。

編集:もちろん、インクルードガードの問題を修正した後、ヘッダーファイルに学生の完全な宣言も必要です。他の人が指摘したように、あなたの場合、前方宣言は十分ではありません。

19
baol

この新しいソースを試してください:

student.h

#include <iostream>

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

student.cpp

#include "student.h"

struct Student student;
26
Zai

Student.hファイルは、「Student」という名前の構造体を前方宣言するだけで、定義しません。参照またはポインターを介してのみ参照する場合は、これで十分です。ただし、使用(作成を含む)しようとするとすぐに、構造の完全な定義が必要になります。

要するに、構造体を移動しますStudent {...}; .hファイルに追加し、メンバー関数の実装に.cppファイルを使用します(メンバー関数はないため、.cppファイルは必要ありません)。

17
Edward Strange

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";

ヒント:

異なるライブラリ間で名前のサイレントクラッシュが発生する可能性があるため、C++ヘッダーファイルにusing namespace std;ディレクティブを配置しないでください。これを修正するには、std名前空間にstd::string foobarstring;を含める代わりに、完全修飾名string foobarstring;を使用します。

16
Eric Leschinski

ヘッダーファイルにはstudentの前方宣言しかありません。 .cppではなく、ヘッダーファイルに構造体宣言を配置する必要があります。メソッド定義は.cppにあります(あると仮定)。

4
andand

さて、私が気づいた3つの大きなこと

  1. クラスファイルにヘッダーファイルを含める必要があります

  2. 決して、ヘッダーまたはクラス内にusingディレクティブを配置するのではなく、std :: cout << "say stuff";のようなことをしてください。

  3. 構造体はヘッダー内で完全に定義され、構造体は基本的にデフォルトでpublicになっているクラスです

お役に立てれば!

2
Jordan LaPrise

できません。

構造体を「使用」する、つまりそのタイプのオブジェクトを宣言し、その内部にアクセスできるようにするには、構造体の完全な定義が必要です。そのため、そのいずれかを実行したい(そして、エラーメッセージで判断すると)構造体タイプの完全な定義をヘッダーファイルに配置する必要があります。

1
AnT