C ++エラー:変数または関数は、ヘッダファイルに定義され
1.背景
4つのファイルの合計b.cpp a1.cpp、a2.cpp、BHを含み、C ++プロジェクトでは、現在ありません。
エラーの2例
BH声明クラスB、SUMはint型を定義しながら、() 。b.cppはB(int型×1、INT×2)を定義します 。a1.cppはメインファイルで、クラスBを呼び出します a2.cppまた、クラスBを呼び出します
BHコードは以下の通りであります:
#pragma once
class B
{
public:
int b1;
int b2;
B(int x1, int x2);
int sum();
};
int B::sum()
{
return b1 + b2;
}
b.cppのコードは以下の通りであります:
// 编程工具:vs2017
#include "pch.h"
#include "b.h"
B::B(int x1, int x2)
{
b1 = x1;
b2 = x2;
}
a1.cppのコードは以下の通りであります:
// 编程工具:vs2017
#include "pch.h"
#include <iostream>
#include "b.h"
using namespace std;
int main()
{
B b(1, 2);
cout << b.sum();
return 0;
}
a2.cppのコードは以下の通りであります:
// 编程工具:vs2017
#include "pch.h"
#include <iostream>
#include "b.h"
using namespace std;
int a2()
{
B b(3, 4);
cout << b.sum();
return 0;
}
エラーメッセージ:
1> ------生成が開始されました:プロジェクト:、コンフィギュレーション:デバッグのWin32 ------
1> a1.cpp
1> a2.cpp
1> B.cpp
1>コードの生成...
1> LINK :Cが見つかりません:\ Users \ユーザー管理を\デスクトップ \ A \デバッグ\ A.EXE または増分リンクの上に生成されません。完全なリンクを行う
1> a2.obj:エラーLNK2005: "パブリック:int型__thiscallのB :: "(?合計(無効)の和 B @@ QAEHXZは@) でa1.objで定義されている
:エラーLNK2005 1> B.OBJ"パブリック:int型__thiscallのB ::合計(無効)「(サムB @ @@? QAEHXZは)でa1.objで定義されている
1> C:\ Users \ユーザー管理 \デスクトップ\ A \デバッグ\ A.EXE:致命的なエラーLNK1169: の一個の以上の乗算定義されたシンボルを見つける
1>プロジェクト「の構築を完了しました。 vcxproj「 -失敗しました。
==========ビルド:0成功、失敗、0最新の、0スキップ==========
3.正しいアプローチ
ではBHのみ声明の中で作られたb.cpp定義について。修正BHコードは次のとおりです。
#pragma once
class B
{
public:
int b1;
int b2;
B(int x1, int x2);
int sum();
};
修正b.cppのコードは次のとおりです。
// 编程工具:vs2017
#include "pch.h"
#include "b.h"
B::B(int x1, int x2)
{
b1 = x1;
b2 = x2;
}
int B::sum()
{
return b1 + b2;
}
結果:
4.まとめ
唯一の宣言用のヘッダファイルでは、それが定義されていません。
場合すべての定義と宣言、及び削除b.cppのa2.cpp、保持a1.cppコールクラスB(BHなどのようなヘッダファイルデータと呼ばれる唯一のファイルは、唯一a1.cpp使用する#include「BH」ものの)、プログラムは文句はありません。
複数のファイルは、このようなb.cpp、a2.cpp、a1.cppとしてヘッダファイルデータを、呼び出したときしかし、の#include「BH」を含まれており、プログラムはエラーになります。