[解決済み】クラスのコンストラクタへの未定義参照、.cppファイルの修正も含む
質問
作成したクラスのコンストラクタを呼び出すと、次のようなエラーが発生します。
main.cpp:20: undefined reference to `StaticObject::StaticObject(Graphics*, sf::String,
sf::Vector2)'
この問題は、main.cpp に .cpp ファイルをインクルードすることで解決できます。
...
#include "GameObjects/StaticObject.cpp"
...
これで問題は解決するのですが、今まで言われてきたことに反しているような気がして、あまり良い解決策とは思えません。この問題を解決する他の方法はないのでしょうか?私はNetbeans 7.3とg++を使用して、このプログラムをコーディング/コンパイルしています。以下は、関連するコードです。
main.cpp
...
#include <SFML/Graphics.hpp>
#include "Graphics/Graphics.hpp"
#include "GameObjects/StaticObject.hpp"
int main(int argc, char** argv) {
//SETUP
Graphics graphics;
background = new StaticObject(&graphics, "Data/Images/BackgroundPlaceholder.png", sf::Vector2f(0,0));
...
main.hpp
...
#include <SFML/Graphics.hpp>
#include "GameObjects/StaticObject.hpp"
...
// Objects
StaticObject *background;
...
StaticObject.hpp
#include <SFML/Graphics.hpp>
#include "../Graphics/Graphics.hpp"
class StaticObject{
public:
StaticObject();
StaticObject(Graphics *_graphics, sf::String texture_filename, sf::Vector2f _position);
StaticObject(const StaticObject& orig);
virtual ~StaticObject();
private:
// The sprite stores the position
sf::Sprite *sprite;
sf::Texture *texture;
};
StaticObject.cpp
#include "StaticObject.hpp"
#include <SFML/Graphics.hpp>
#include "../Graphics/Graphics.hpp"
StaticObject::StaticObject(){
}
StaticObject::StaticObject(Graphics *_graphics, sf::String texture_filename, sf::Vector2f _position) {
sprite = _graphics->AddSprite(texture_filename);
sprite->setPosition(_position);
}
StaticObject::StaticObject(const StaticObject& orig) {
}
StaticObject::~StaticObject() {
}
main.cppに以下の行を追加すると、エラーが消えます。
#include "GameObject/StaticObject.cpp"
どなたか説明をお願いします。
なぜこれで問題が解決するのですか?
なぜ .hpp をインクルードする際に .cpp が暗黙のうちにインクルードされなかったのか? ファイルですか?
もっと良い方法はないでしょうか?
どのように解決するのですか?
その {コード {コード エラーは、関数/メソッド (ここではコンストラクタ) の定義がリンカによって見つからなかったことを示します。
undefined reference
そして、次の行を追加する理由。
StaticObject::StaticObject(Graphics*, sf::String, sf::Vector2<float>)
はこの問題を解決するために、その実装を
#include "GameObject/StaticObject.cpp"
にあるのに対して、実際の実装は
main.cpp
. これは
不正確な方法
をクリックすると、この問題を解決することができます。
Netbeansをあまり使ったことがないのですが、すべての.cppファイルを単一のプロジェクトに追加するオプションがあるはずです。
StaticObject.cpp
ファイルを1つの実行ファイルにすることができます。
もし
.o
がそれ自身のライブラリに組み込まれている場合(ここではそうでないことを強く疑います)、リンカーが実装を見つけられるように、そのライブラリの場所へのパスを指定しなければならないかもしれません。
プログラムをビルドするときは、こうするのが理想的です。
StaticObject.cpp
gcc/g++ では、中間的な .o ファイルの生成をすべてスキップして、直接、.o ファイルを生成する方法があります。
Compile: StaticObject.cpp -> StaticObject.o
Compile: main.cpp -> main.o
Link: StaticObject.o, main.o -> main_program
すべてのソースファイル(およびライブラリ)を同じコマンドラインで指定した場合。
関連
-
[解決済み】C++ - 解放されるポインタが割り当てられていないエラー
-
[解決済み】エラー。switchステートメントでcaseラベルにジャンプする
-
[解決済み】Visual C++で "Debug Assertion failed "の原因となる行を見つける。
-
[解決済み】Visual Studio 2013および2015でC++コンパイラーエラーC2280「削除された関数を参照しようとした」が発生する
-
[解決済み】CMakeエラー at CMakeLists.txt:30 (project)。CMAKE_C_COMPILER が見つかりませんでした。
-
[解決済み】デバッグアサーションに失敗しました
-
[解決済み] ベースクラスのコンストラクタを呼び出す際のルールは?
-
[解決済み] C++テンプレート関数定義の.CPPファイルへの格納
-
[解決済み】vtableへの未定義の参照
-
[解決済み】静的クラスメンバへの未定義参照
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】コンストラクターでのエラー:識別子を期待されますか?
-
[解決済み] エラーが発生する。ISO C++は型を持たない宣言を禁じています。
-
[解決済み】C++コンパイルタイムエラー:数値定数の前に期待される識別子
-
[解決済み] 既に.objで定義されている-二重包含はない
-
[解決済み】エラー:strcpyがこのスコープで宣言されていない
-
[解決済み】「std::operator」で「operator<<」にマッチするものがない。
-
[解決済み】標準ライブラリにstd::endlに相当するタブはあるか?
-
[解決済み】クラスのコンストラクタへの未定義参照、.cppファイルの修正も含む
-
[解決済み】演算子のオーバーロード C++; <<操作のパラメータが多すぎる
-
[解決済み】エラー。引数リストに一致するコンストラクタのインスタンスがない