私は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して、その構造体の使用を開始するにはどうすればよいですか?
この新しいソースを試してください:
#include <iostream>
struct Student {
std::string lastName;
std::string firstName;
};
#include "student.h"
struct Student student;
Student.hファイルは、「Student」という名前の構造体を前方宣言するだけで、定義しません。参照またはポインターを介してのみ参照する場合は、これで十分です。ただし、使用(作成を含む)しようとするとすぐに、構造の完全な定義が必要になります。
要するに、構造体を移動しますStudent {...}; .hファイルに追加し、メンバー関数の実装に.cppファイルを使用します(メンバー関数はないため、.cppファイルは必要ありません)。
これを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;
を使用します。
ヘッダーファイルにはstudent
の前方宣言しかありません。 .cppではなく、ヘッダーファイルに構造体宣言を配置する必要があります。メソッド定義は.cppにあります(あると仮定)。
さて、私が気づいた3つの大きなこと
クラスファイルにヘッダーファイルを含める必要があります
決して、ヘッダーまたはクラス内にusingディレクティブを配置するのではなく、std :: cout << "say stuff";のようなことをしてください。
構造体はヘッダー内で完全に定義され、構造体は基本的にデフォルトでpublicになっているクラスです
お役に立てれば!
できません。
構造体を「使用」する、つまりそのタイプのオブジェクトを宣言し、その内部にアクセスできるようにするには、構造体の完全な定義が必要です。そのため、そのいずれかを実行したい(そして、エラーメッセージで判断すると)構造体タイプの完全な定義をヘッダーファイルに配置する必要があります。