質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

1400閲覧

C++でクラスの定義とメンバ関数の定義を別々のファイルで記述し、プログラムを実現したい

temineko

総合スコア2

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2021/08/05 14:13

編集2021/08/06 17:15

前提・実現したいこと

現在、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にメンバ関数の定義を追加してビルドしました。結果としては実は問題なく動きました。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2021/08/05 14:18

しつもんはなんでしょうか
temineko

2021/08/05 14:24

すいません、記述不足でした。該当のソースコードに記載しているmain.cpp,sample.cpp,sample.hのファイル構成でコンパイルエラーを起こさずにプログラム実行までできるようにしたいです。
guest

回答2

0

問題自体は解決積みですが

>collect2.exe: error: ld returned 1 exit status
は、コンパイルフェーズではなくリンクフェーズで出ています

collect2.exe は gcc.exe がリンクを外注するリンカです

「リンクエラー」と言ってください
「コンパイルエラー」は誤りです

投稿2021/08/05 20:01

Tirou

総合スコア10

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

temineko

2021/08/06 16:00

collect2とはリンカだったのですね。勉強になりました。修正させていただきます。教えていただきありがとうございました。
guest

0

ベストアンサー

sample.cpp をコンパイルしてないんじゃなくて?
g++ -o collext2.exe main.cpp sample.cpp ってやりました?

投稿2021/08/05 14:47

episteme

総合スコア16614

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

temineko

2021/08/05 14:57

していませんでした。今コンパイルしてみたところ、解決できました。勉強不足でした。教えていただきありがとうございます。
episteme

2021/08/06 02:32

あ、collect2.exe ってリンカのことやったんね。失礼しました(生成されるロードモジュールやと思ってたorz)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問