クラスを入れたヘッダーファイルを他のヘッダーファイルで読み込んで、さらにそれを複数のソースファイルで使いたいと思ってるんですけど、どうすればいいかわかりません。そもそも、これは可能なのでしょうか?
教えてください。
あと、ファイルを添付しておきます。(今の状態ではエラーが出ますけど^^;)
ヘッダーファイルについて
Re:ヘッダーファイルについて
boxさんが言うように、インクルードガードについて調べて、それを使ってコンパイルしてみました。
しかし、やっぱりエラーが出てしまいます・・・。どうしてでしょうか?
/* CString.h */
#ifndef CSTRING_H
#define CSTRING_H
中略
#endif
今上に書いたような感じになってるんですけど、これが間違ってるんでしょうか?
しかし、やっぱりエラーが出てしまいます・・・。どうしてでしょうか?
/* CString.h */
#ifndef CSTRING_H
#define CSTRING_H
中略
#endif
今上に書いたような感じになってるんですけど、これが間違ってるんでしょうか?
Re:ヘッダーファイルについて
添付されているファイルにはインクルードガードとほぼ同様の #pragma once が入っているので、
結果はかわらないと思います。
ヘッダファイルにはクラスメンバ関数の定義があるので、その部分だけを別のソースファイル(*.cpp)に移してやってみたらどうでしょうか。(CString.hへのインクルードは必要)
結果はかわらないと思います。
ヘッダファイルにはクラスメンバ関数の定義があるので、その部分だけを別のソースファイル(*.cpp)に移してやってみたらどうでしょうか。(CString.hへのインクルードは必要)
Re:ヘッダーファイルについて
> 今の状態ではエラーが出ますけど
「エラーが出る」ではなく,「こういうエラーが出る」と,具体的なエラーの中身を提示してみてください。
エラーメッセージをCopy & Pasteするのが一番良い方法ですが,ファイル名などは隠しても問題ないと思います。
「エラーが出る」ではなく,「こういうエラーが出る」と,具体的なエラーの中身を提示してみてください。
エラーメッセージをCopy & Pasteするのが一番良い方法ですが,ファイル名などは隠しても問題ないと思います。
Re:ヘッダーファイルについて
とりあえず、上で添付したファイルをコンパイルすると、
mein.obj : error LNK2005: "public: __thiscall CString::CString(void)" (??0CString@@QAE@XZ) は既に a.obj で定義されています。
mein.obj : error LNK2005: "public: __thiscall CString::CString(int)" (??0CString@@QAE@H@Z) は既に a.obj で定義されています。
mein.obj : error LNK2005: "public: __thiscall CString::~CString(void)" (??1CString@@QAE@XZ) は既に a.obj で定義されています。
mein.obj : error LNK2005: "public: class CString & __thiscall CString::CopyString(char *,int)" (?CopyString@CString@@QAEAAV1@PADH@Z) は既に a.obj で定義されています。
mein.obj : error LNK2005: "public: class CString & __thiscall CString::CatString(char *)" (?CatString@CString@@QAEAAV1@PAD@Z) は既に a.obj で定義されています。
mein.obj : error LNK2005: "public: class CString & __cdecl CString::Format(char *,...)" (?Format@CString@@QAAAAV1@PADZZ) は既に a.obj で定義されています。
mein.obj : error LNK2005: "public: class CString & __thiscall CString::LeftTrim(void)" (?LeftTrim@CString@@QAEAAV1@XZ) は既に a.obj で定義されています。
mein.obj : error LNK2005: "public: class CString & __thiscall CString::RightTrim(void)" (?RightTrim@CString@@QAEAAV1@XZ) は既に a.obj で定義されています。
mein.obj : error LNK2005: "public: class CString & __thiscall CString::Trim(void)" (?Trim@CString@@QAEAAV1@XZ) は既に a.obj で定義されています。
mein.obj : error LNK2005: "public: class CString & __thiscall CString::Left(int)" (?Left@CString@@QAEAAV1@H@Z) は既に a.obj で定義されています。
mein.obj : error LNK2005: "public: class CString & __thiscall CString::Right(int)" (?Right@CString@@QAEAAV1@H@Z) は既に a.obj で定義されています。
mein.obj : error LNK2005: "public: class CString & __thiscall CString::Mid(int,int)" (?Mid@CString@@QAEAAV1@HH@Z) は既に a.obj で定義されています。
mein.obj : error LNK2005: "public: class CString & __thiscall CString::Delete(int,int)" (?Delete@CString@@QAEAAV1@HH@Z) は既に a.obj で定義されています。
mein.obj : error LNK2005: "public: int __thiscall CString::Find(char)" (?Find@CString@@QAEHD@Z) は既に a.obj で定義されています。
mein.obj : error LNK2005: "public: int __thiscall CString::Find(char *)" (?Find@CString@@QAEHPAD@Z) は既に a.obj で定義されています。
mein.obj : error LNK2005: "public: int __thiscall CString::ReverseFind(char)" (?ReverseFind@CString@@QAEHD@Z) は既に a.obj で定義されています。
mein.obj : error LNK2005: "public: int __thiscall CString::ReverseFind(char *)" (?ReverseFind@CString@@QAEHPAD@Z) は既に a.obj で定義されています。
LINK : fatal error LNK1104: ファイル 'DxLib.lib' を開くことができません。
と、18個のエラーが出ます。
mein.obj : error LNK2005: "public: __thiscall CString::CString(void)" (??0CString@@QAE@XZ) は既に a.obj で定義されています。
mein.obj : error LNK2005: "public: __thiscall CString::CString(int)" (??0CString@@QAE@H@Z) は既に a.obj で定義されています。
mein.obj : error LNK2005: "public: __thiscall CString::~CString(void)" (??1CString@@QAE@XZ) は既に a.obj で定義されています。
mein.obj : error LNK2005: "public: class CString & __thiscall CString::CopyString(char *,int)" (?CopyString@CString@@QAEAAV1@PADH@Z) は既に a.obj で定義されています。
mein.obj : error LNK2005: "public: class CString & __thiscall CString::CatString(char *)" (?CatString@CString@@QAEAAV1@PAD@Z) は既に a.obj で定義されています。
mein.obj : error LNK2005: "public: class CString & __cdecl CString::Format(char *,...)" (?Format@CString@@QAAAAV1@PADZZ) は既に a.obj で定義されています。
mein.obj : error LNK2005: "public: class CString & __thiscall CString::LeftTrim(void)" (?LeftTrim@CString@@QAEAAV1@XZ) は既に a.obj で定義されています。
mein.obj : error LNK2005: "public: class CString & __thiscall CString::RightTrim(void)" (?RightTrim@CString@@QAEAAV1@XZ) は既に a.obj で定義されています。
mein.obj : error LNK2005: "public: class CString & __thiscall CString::Trim(void)" (?Trim@CString@@QAEAAV1@XZ) は既に a.obj で定義されています。
mein.obj : error LNK2005: "public: class CString & __thiscall CString::Left(int)" (?Left@CString@@QAEAAV1@H@Z) は既に a.obj で定義されています。
mein.obj : error LNK2005: "public: class CString & __thiscall CString::Right(int)" (?Right@CString@@QAEAAV1@H@Z) は既に a.obj で定義されています。
mein.obj : error LNK2005: "public: class CString & __thiscall CString::Mid(int,int)" (?Mid@CString@@QAEAAV1@HH@Z) は既に a.obj で定義されています。
mein.obj : error LNK2005: "public: class CString & __thiscall CString::Delete(int,int)" (?Delete@CString@@QAEAAV1@HH@Z) は既に a.obj で定義されています。
mein.obj : error LNK2005: "public: int __thiscall CString::Find(char)" (?Find@CString@@QAEHD@Z) は既に a.obj で定義されています。
mein.obj : error LNK2005: "public: int __thiscall CString::Find(char *)" (?Find@CString@@QAEHPAD@Z) は既に a.obj で定義されています。
mein.obj : error LNK2005: "public: int __thiscall CString::ReverseFind(char)" (?ReverseFind@CString@@QAEHD@Z) は既に a.obj で定義されています。
mein.obj : error LNK2005: "public: int __thiscall CString::ReverseFind(char *)" (?ReverseFind@CString@@QAEHPAD@Z) は既に a.obj で定義されています。
LINK : fatal error LNK1104: ファイル 'DxLib.lib' を開くことができません。
と、18個のエラーが出ます。
Re:ヘッダーファイルについて
リンクエラーですね。
今回の場合は,最後の物 (DxLib.libを開けない) を除くと,単一定義規則違反のようです。
インクルードガードは,「ひとつの」翻訳単位に対してのみガードする物です。
それに対して,このエラーは,「複数の」翻訳単位に同一名の関数があるために起きています。
・インライン関数 (クラス内定義,テンプレートなどの暗黙による物を含む) を除くすべての関数は,インクルードされるファイルに書かない
・変数の定義は,インクルードされるファイルに書かない
これを守る必要があります。
今回の場合は,最後の物 (DxLib.libを開けない) を除くと,単一定義規則違反のようです。
インクルードガードは,「ひとつの」翻訳単位に対してのみガードする物です。
それに対して,このエラーは,「複数の」翻訳単位に同一名の関数があるために起きています。
・インライン関数 (クラス内定義,テンプレートなどの暗黙による物を含む) を除くすべての関数は,インクルードされるファイルに書かない
・変数の定義は,インクルードされるファイルに書かない
これを守る必要があります。