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

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

新規登録して質問してみよう
ただいま回答率
85.35%
MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

C++

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

Q&A

1回答

6028閲覧

自作ヘッダファイルがインクルードできない

toyo_69

総合スコア20

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

C++

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

0グッド

0クリップ

投稿2020/06/30 13:20

編集2020/07/01 04:17

プログラミング初学者です。

自前のPC(Mac)で主にAtomエディタを用いて、プログラムをmain関数部、クラスの宣言をするヘッダファイル部、メンバ関数の内容の記述部に分けて書いているのですが、main関数で使うクラスのヘッダファイルをインクルードする際や継承先のクラスを宣言しているヘッダファイルで継承元のクラスのヘッダファイルをインクルードしようとすると毎回エラーとなってしまいます。そこでヘッダファイルの代わりにメンバ関数の内容の記述部をインクルードすると上手く動作するのでそれでやり過ごしています。本来なら自作ヘッダファイルのインクルードが通り問題なくプログラムが実行できるはずですがそれだと上手くいかないです。Atomの記事が少なく、自分では解決できそうにないです。どなたかご教授願います。

インストールしてあるコミュニティーパッケージは
・busy-signal(2.0.1)
・expose(0.15.0)
・cpp-compiler(3.0.7)
・intentions(1.1.5)
・japanese-menu(1.15.0)
・linter(2.3.1)
・linter-gcc(0.9.0)
・linter-ui-default(1.8.1)
・memory-bro(2.1.0)
・script(3.26.0)
・script-runner(2.5.0)
です。

このような分割プログラムにすると毎回どれも自作ヘッダファイルがインクルードできない状態なのでプログラム面には問題ないかと思われますが念のため問題が発生するソースコードの例を下記に置いておきます。
コンストラクタを用いてデフォルト引数を指定し、名前、課題の点数、平均点、合計点数を表示させるプログラムです。

main

1/*main.cpp*/ 2#include "Student.cpp" 3#include "StudentEx.cpp" 4 5int main() 6{ 7 //オブジェクトを初期化 8 Student taro("taro", 100, 80); 9 taro.CalcAve(); 10 cout << taro.Name() << endl; 11 cout << "kadai1:" << taro.GetKadai1() 12 << " kadai2:" << taro.GetKadai2() << endl; 13 cout << "ave:" << taro.Average() 14 << " sum:" << taro.GetSum() << endl; 15 16 //オブジェクトを初期化 17 StudentEx jiro("jiro", 90, 70, 50); 18 jiro.CalcAve(); 19 cout << jiro.Name() << endl; 20 cout << "kadai1:" << jiro.GetKadai1() 21 << " kadai2:" << jiro.GetKadai2() 22 << " kadai3:" << jiro.GetKadai3() << endl; 23 cout << "ave:" << jiro.Average() 24 << " sum:" << jiro.GetSum() << endl; 25 26 return 0; 27}

header1

1/*Student.h*/ 2#define _CRT_SECURE_NO_WARNINGS 3#include <string.h> 4#include <iostream> 5using namespace std; 6#pragma once 7 8class Student { 9public: 10 char name[20]; //氏名 11 int kadai1; //課題1の点数 12 int kadai2; //課題2の点数 13 int ave; //平均点 14 15 void SetName(const char *n) { strcpy(name, n); } 16 void SetKadai1(int k1) { kadai1 = k1; } 17 void SetKadai2(int k2) { kadai2 = k2; } 18 19 char *Name() { return name; } 20 int GetKadai1() { return kadai1; } 21 int GetKadai2() { return kadai2; } 22 int Average(){ return ave; } 23 24 int GetSum(); //合計点を求める 25 void CalcAve(); //平均点を求める 26 //コンストラクタ 27 Student() { cout << "Studentのコンストラクタ" << endl; } 28 //引数付きコンストラクタ 29 Student(const char *name, int k1, int k2); 30}; 31

header2

1/*StudentEx.h*/ 2#include "Student.h" 3//StudentExの二重定義を防止 4#pragma once 5 6class StudentEx : public Student { 7public: 8 int kadai3; 9 void SetKadai3(int k3) { kadai3 = k3; } 10 int GetKadai3() { return kadai3; } 11 int GetSum(); 12 void CalcAve(); 13 //コンストラクタ 14 StudentEx() { cout << "StudentExのコンストラクタ" << endl; } 15 //引数付きコンストラクタ 16 StudentEx(const char *name, int k1, int k2, int k3); 17}; 18

Student

1/*Student.cpp*/ 2#include "Student.h" 3 4Student::Student(const char *name, int k1, int k2) { 5 SetName(name); 6 SetKadai1(k1); 7 SetKadai2(k2); 8} 9 10int Student::GetSum() 11{ 12 return kadai1 + kadai2; 13} 14 15void Student::CalcAve() 16{ 17 ave = (kadai1 + kadai2) / 2; 18} 19

StudentEx

1/*StudentEx.cpp*/ 2#include "StudentEx.h" 3//基底クラスのイニシャライザを指定 4StudentEx::StudentEx(const char *name, int k1, int k2, int k3) : Student(name, k1, k2) { 5 SetKadai3(k3); 6} 7 8int StudentEx::GetSum() { 9 int sum; 10 //基底クラスのGetSum()を呼び出して機能を追加 11 sum = Student::GetSum(); 12 sum += kadai3; 13 return sum; 14} 15 16void StudentEx::CalcAve() { 17 //基底クラスのCalcAve()を呼び出して機能を追加 18 Student::CalcAve(); 19 ave = (2 * ave + kadai3) / 3; 20} 21

こういったプログラムで例えば上記の例ではmain部の始めの行でStudentとStudentExの関数内容記述部をインクルードしていますが、代わりにそれぞれのヘッダファイルをインクルードすると次のようなエラーが出力されます。Xcodeではヘッダファイルをインクルードして実行できたのでAtom側の何かしらの問題かと思われます。

Undefined symbols for architecture x86_64: "Student::GetSum()", referenced from: _main in main-b2a933.o "Student::CalcAve()", referenced from: _main in main-b2a933.o "Student::Student(char const*, int, int)", referenced from: _main in main-b2a933.o "StudentEx::GetSum()", referenced from: _main in main-b2a933.o "StudentEx::CalcAve()", referenced from: _main in main-b2a933.o "StudentEx::StudentEx(char const*, int, int, int)", referenced from: _main in main-b2a933.o ld: symbol(s) not found for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see invocation)

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

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

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

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

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

cateye

2020/06/30 14:34 編集

問題の有るソースを提示して下さい。
cateye

2020/07/01 06:09 編集

_CRT_SECURE_NO_WARNINGSって、Windows?・・・これ、VS用です^^; で、リンクエラーですが?・・・Atomって使ったことがないのですが、プロジェクトって作れないのですか? Student.cppやStudentEx.cppの関数が見つからないと言っています、一緒にコンパイルしてるんですよね? #・・・macはCotEditorばっかv^^・・・IDEは、Geany・・・
guest

回答1

0

・インクルードファイルの記述方法は合っていますか?
・・・#include "〜"

・別ディレクトリに有るファイルをインクルードする時は、コンパイルオプションに該当ディレクトリを指定しましょう。
・・・-I

投稿2020/06/30 14:36

編集2020/06/30 14:38
cateye

総合スコア6851

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

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

cateye

2020/06/30 15:06

エラーは、エラーメッセージを、そのまま(加工せずに)貼り付けて下さい。
toyo_69

2020/07/01 04:54

ソースコードを追加しました。インクルードファイルの記述方法は合ってると思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問