teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

1

該当するソースコードとエラー内容を追加しました。

2020/07/01 04:17

投稿

toyo_69
toyo_69

スコア20

title CHANGED
File without changes
body CHANGED
@@ -14,4 +14,153 @@
14
14
  ・memory-bro(2.1.0)
15
15
  ・script(3.26.0)
16
16
  ・script-runner(2.5.0)
17
- です。
17
+ です。
18
+
19
+ このような分割プログラムにすると毎回どれも自作ヘッダファイルがインクルードできない状態なのでプログラム面には問題ないかと思われますが念のため問題が発生するソースコードの例を下記に置いておきます。
20
+ コンストラクタを用いてデフォルト引数を指定し、名前、課題の点数、平均点、合計点数を表示させるプログラムです。
21
+
22
+ ```main
23
+ /*main.cpp*/
24
+ #include "Student.cpp"
25
+ #include "StudentEx.cpp"
26
+
27
+ int main()
28
+ {
29
+ //オブジェクトを初期化
30
+ Student taro("taro", 100, 80);
31
+ taro.CalcAve();
32
+ cout << taro.Name() << endl;
33
+ cout << "kadai1:" << taro.GetKadai1()
34
+ << " kadai2:" << taro.GetKadai2() << endl;
35
+ cout << "ave:" << taro.Average()
36
+ << " sum:" << taro.GetSum() << endl;
37
+
38
+ //オブジェクトを初期化
39
+ StudentEx jiro("jiro", 90, 70, 50);
40
+ jiro.CalcAve();
41
+ cout << jiro.Name() << endl;
42
+ cout << "kadai1:" << jiro.GetKadai1()
43
+ << " kadai2:" << jiro.GetKadai2()
44
+ << " kadai3:" << jiro.GetKadai3() << endl;
45
+ cout << "ave:" << jiro.Average()
46
+ << " sum:" << jiro.GetSum() << endl;
47
+
48
+ return 0;
49
+ }
50
+ ```
51
+ ```header1
52
+ /*Student.h*/
53
+ #define _CRT_SECURE_NO_WARNINGS
54
+ #include <string.h>
55
+ #include <iostream>
56
+ using namespace std;
57
+ #pragma once
58
+
59
+ class Student {
60
+ public:
61
+ char name[20]; //氏名
62
+ int kadai1; //課題1の点数
63
+ int kadai2; //課題2の点数
64
+ int ave; //平均点
65
+
66
+ void SetName(const char *n) { strcpy(name, n); }
67
+ void SetKadai1(int k1) { kadai1 = k1; }
68
+ void SetKadai2(int k2) { kadai2 = k2; }
69
+
70
+ char *Name() { return name; }
71
+ int GetKadai1() { return kadai1; }
72
+ int GetKadai2() { return kadai2; }
73
+ int Average(){ return ave; }
74
+
75
+ int GetSum(); //合計点を求める
76
+ void CalcAve(); //平均点を求める
77
+ //コンストラクタ
78
+ Student() { cout << "Studentのコンストラクタ" << endl; }
79
+ //引数付きコンストラクタ
80
+ Student(const char *name, int k1, int k2);
81
+ };
82
+
83
+ ```
84
+ ```header2
85
+ /*StudentEx.h*/
86
+ #include "Student.h"
87
+ //StudentExの二重定義を防止
88
+ #pragma once
89
+
90
+ class StudentEx : public Student {
91
+ public:
92
+ int kadai3;
93
+ void SetKadai3(int k3) { kadai3 = k3; }
94
+ int GetKadai3() { return kadai3; }
95
+ int GetSum();
96
+ void CalcAve();
97
+ //コンストラクタ
98
+ StudentEx() { cout << "StudentExのコンストラクタ" << endl; }
99
+ //引数付きコンストラクタ
100
+ StudentEx(const char *name, int k1, int k2, int k3);
101
+ };
102
+
103
+ ```
104
+ ```Student
105
+ /*Student.cpp*/
106
+ #include "Student.h"
107
+
108
+ Student::Student(const char *name, int k1, int k2) {
109
+ SetName(name);
110
+ SetKadai1(k1);
111
+ SetKadai2(k2);
112
+ }
113
+
114
+ int Student::GetSum()
115
+ {
116
+ return kadai1 + kadai2;
117
+ }
118
+
119
+ void Student::CalcAve()
120
+ {
121
+ ave = (kadai1 + kadai2) / 2;
122
+ }
123
+
124
+ ```
125
+ ```StudentEx
126
+ /*StudentEx.cpp*/
127
+ #include "StudentEx.h"
128
+ //基底クラスのイニシャライザを指定
129
+ StudentEx::StudentEx(const char *name, int k1, int k2, int k3) : Student(name, k1, k2) {
130
+ SetKadai3(k3);
131
+ }
132
+
133
+ int StudentEx::GetSum() {
134
+ int sum;
135
+ //基底クラスのGetSum()を呼び出して機能を追加
136
+ sum = Student::GetSum();
137
+ sum += kadai3;
138
+ return sum;
139
+ }
140
+
141
+ void StudentEx::CalcAve() {
142
+ //基底クラスのCalcAve()を呼び出して機能を追加
143
+ Student::CalcAve();
144
+ ave = (2 * ave + kadai3) / 3;
145
+ }
146
+
147
+ ```
148
+
149
+ こういったプログラムで例えば上記の例ではmain部の始めの行でStudentとStudentExの関数内容記述部をインクルードしていますが、代わりにそれぞれのヘッダファイルをインクルードすると次のようなエラーが出力されます。Xcodeではヘッダファイルをインクルードして実行できたのでAtom側の何かしらの問題かと思われます。
150
+ ```
151
+ Undefined symbols for architecture x86_64:
152
+ "Student::GetSum()", referenced from:
153
+ _main in main-b2a933.o
154
+ "Student::CalcAve()", referenced from:
155
+ _main in main-b2a933.o
156
+ "Student::Student(char const*, int, int)", referenced from:
157
+ _main in main-b2a933.o
158
+ "StudentEx::GetSum()", referenced from:
159
+ _main in main-b2a933.o
160
+ "StudentEx::CalcAve()", referenced from:
161
+ _main in main-b2a933.o
162
+ "StudentEx::StudentEx(char const*, int, int, int)", referenced from:
163
+ _main in main-b2a933.o
164
+ ld: symbol(s) not found for architecture x86_64
165
+ clang: error: linker command failed with exit code 1 (use -v to see invocation)
166
+ ```