前提・実現したいこと
現在、C++の勉強をしているものです。作るプログラム自体はものすごく単純なもので、下記のようにターミナル(shellscript)上に整数の入力を促す文章を表示したのち、その数字を表示するといったものです。
実行結果
整数を入力してください:5
5
使用している開発環境
エディタ:VScode
コンパイラ:MinGW(コンパイラなのかな?)
プログラムのファイル構成
main.cpp : main関数が記述されたファイル
sample.cpp : sample.hで定義されたメンバ関数を定義しているファイル
sample.h : 今回使うクラスが定義されたヘッダファイル
VScode上でshellscriptを起動し、下記のコマンド
g++ ビルド対象のファイル(今回の場合だと.\main.cpp)
でビルドを行っています。
下の試したところで記述はしているのですがファイル構成を直したところ問題なく動きはしました。しかし、実際の開発現場だとソースコードのようにクラスの定義とメンバ関数の定義を別々のファイルにするようなので、ソースコード欄のファイル構成で何とか動かしたいと思っています。お力添えいただける方いらっしゃいましたら、何卒よろしくお願いいたします。
発生している問題・エラーメッセージ
リンクエラーが起こります。エラーメッセージ曰く、メンバ関数が定義されていないとの事なので原因としてはメンバ関数の定義がされているsample.cppがビルド通ってないのではと考えています。
c:/mingw/bin/../lib/gcc/mingw32/9.2.0/../../../../mingw32/bin/ld.exe: C:\Users\81908\AppData\Local\Temp\ccRFbUlN.o:main.cpp:(.text+0x23): undefined reference to `CSample::set(int)' c:/mingw/bin/../lib/gcc/mingw32/9.2.0/../../../../mingw32/bin/ld.exe: C:\Users\81908\AppData\Local\Temp\ccRFbUlN.o:main.cpp:(.text+0x30): undefined reference to `CSample::get()' collect2.exe: error: ld returned 1 exit status
該当のソースコード
C++
1main.cppーーーーーーーーーー 2 3 4#include <iostream> 5#include "sample.h" 6 7using namespace std; 8 9int main() 10{ 11 CSample obj; // CSampleをインスタンス化 12 int num; 13 14 cout << "整数を入力して下さい:" << endl; 15 cin >> num; 16 17 obj.set( num ); // CSampleのメンバ変数をセット 18 cout << obj.get() << endl; // メンバ変数の値を出力 19 20 return 0; 21} 22 23ーーーーーーーーーーーーーーーー 24 25sample.cppーーーーーーーーーー 26 27#include <iostream> 28#include "sample.h" 29 30void CSample::set(int num) 31{ 32 m_num = num; 33} 34 35int CSample::get() 36{ 37 return m_num; 38} 39 40ーーーーーーーーーーーーーーー 41 42sample.hーーーーーーーーーー 43 44#ifndef _SAMPLE_H_ 45#define _SAMPLE_H_ 46 47// クラス宣言 48class CSample 49{ 50public: 51 void set(int num); // m_numに値を設定する 52 int get(); // m_numの値を取得する 53private: 54 int m_num; 55}; 56 57 58#endif //_SAMPLE_H_ 59 60ーーーーーーーーーーーーーーー
試したこと
sample.cppを消し、sample.hにメンバ関数の定義を追加してビルドしました。結果としては実は問題なく動きました。
回答2件
あなたの回答
tips
プレビュー