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

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

新規登録して質問してみよう
ただいま回答率
87.20%
オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

コンストラクタ

オブジェクト指向言語において、オブジェクトを生成時に呼び出され、データの初期化などを行なう関数・メソッドのことである。

C++

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

解決済

オブジェクト指向についての勉強が浅くなぜ未定義エラーが出ているのか分かりません

jagaimo0
jagaimo0

総合スコア33

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

コンストラクタ

オブジェクト指向言語において、オブジェクトを生成時に呼び出され、データの初期化などを行なう関数・メソッドのことである。

C++

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

3回答

-1評価

0クリップ

814閲覧

投稿2021/10/14 10:32

編集2021/10/15 05:02

質問

C++でのエラーについて
コンストラクタを設定しているはずなのに変数やメソッドのエラーが出ます。
オブジェクト指向についての勉強が浅くなぜコンストラクタでセットしている部分の未定義エラーが出ているのか分かりません
教えていただけると助かります。

実行環境

・C++バージョン
Apple clang version 12.0.5 (clang-1205.0.22.9)
Target: arm64-apple-darwin20.3.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin

・コンパイル
/opt/homebrew/opt/llvm/bin/clang++ -std=c++17 Interaction.cpp

*の位置を修正した後のエラーメッセージ

Interaction.cpp:72:10: warning: address of stack memory associated with local variable 'dv_sep' returned [-Wreturn-stack-address] return dv_sep; ^~~~~~ Interaction.cpp:111:10: warning: address of stack memory associated with local variable 'dv_coh' returned [-Wreturn-stack-address] return dv_coh; ^~~~~~ 2 warnings generated. "/usr/bin/ld" -demangle -lto_library /opt/homebrew/Cellar/llvm/12.0.0_1/lib/libLTO.dylib -no_deduplicate -dynamic -arch arm64 -platform_version macos 11.0.0 0.0.0 -syslibroot /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk -o a.out /var/folders/k_/4f4mn0653xg82mqzygyrfqlr0000gn/T/Interaction-23c16d.o -lc++ -lSystem /opt/homebrew/Cellar/llvm/12.0.0_1/lib/clang/12.0.0/lib/darwin/libclang_rt.osx.a Undefined symbols for architecture arm64: "_main", referenced from: implicit entry/start for main executable ld: symbol(s) not found for architecture arm64 clang-12: error: linker command failed with exit code 1 (use -v to see invocation)

発生している問題・エラーメッセージ

Interaction.cpp:41:22: error: use of undeclared identifier 'n' for(int j = 0; j < n; j++) { ^ Interaction.cpp:46:5: error: use of undeclared identifier 'dis'; did you mean 'div'? dis[j] = E_dis(my_posx, posx[j], my_posy, posy[j]); ^~~ div /opt/homebrew/opt/llvm/bin/../include/c++/v1/stdlib.h:146:42: note: 'div' declared here inline _LIBCPP_INLINE_VISIBILITY lldiv_t div(long long __x, ^ Interaction.cpp:46:5: error: subscript of pointer to function type 'lldiv_t (long long, long long) noexcept' dis[j] = E_dis(my_posx, posx[j], my_posy, posy[j]); ^~~ Interaction.cpp:46:14: error: use of undeclared identifier 'E_dis' dis[j] = E_dis(my_posx, posx[j], my_posy, posy[j]); ^ Interaction.cpp:47:5: error: use of undeclared identifier 'angle' angle[j] = E_angle(my_posx, posx[j], my_posy, posy[j]); ^ Interaction.cpp:47:16: error: use of undeclared identifier 'E_angle' angle[j] = E_angle(my_posx, posx[j], my_posy, posy[j]); ^ Interaction.cpp:50:8: error: use of undeclared identifier 'dis'; did you mean 'div'? if(dis[j] <= sep_dis && angle[j] <= sep_angle){ ^~~ div /opt/homebrew/opt/llvm/bin/../include/c++/v1/stdlib.h:146:42: note: 'div' declared here inline _LIBCPP_INLINE_VISIBILITY lldiv_t div(long long __x, ^ Interaction.cpp:50:8: error: subscript of pointer to function type 'lldiv_t (long long, long long) noexcept' if(dis[j] <= sep_dis && angle[j] <= sep_angle){ ^~~ Interaction.cpp:50:18: error: use of undeclared identifier 'sep_dis' if(dis[j] <= sep_dis && angle[j] <= sep_angle){ ^ Interaction.cpp:50:29: error: use of undeclared identifier 'angle' if(dis[j] <= sep_dis && angle[j] <= sep_angle){ ^ Interaction.cpp:50:41: error: use of undeclared identifier 'sep_angle' if(dis[j] <= sep_dis && angle[j] <= sep_angle){ ^ Interaction.cpp:64:17: error: use of undeclared identifier 'sep_force' dv_sep[0] = sep_force * (my_posx - that_ave[0]); // that_sum[0][i]); ^ Interaction.cpp:65:17: error: use of undeclared identifier 'sep_force' 文字数の問題で省略しています。

該当のソースコード

C++

/* Interaction.hpp */ #ifndef __CLASS__INTERACTION #include <cmath> #include <vector> #define __CLASS__INTERACTION //===== 相互作用クラス =====// class Interaction { public: int n; double sep_force; double sep_dis; double sep_angle; double coh_force; double coh_dis; double dis[36] = {}; double angle[36] = {}; //--- コンストラクタ ---// Interaction(int nn, double sf, double sd, double sa, double cf, double cd); ~Interaction(); // デストラクタ //--- セッタ ---// void set(int nn, double sf, double sd, double sa, double cf, double cd); //--- 分離力計算 ---// double *CalculateSeparation(const int num, const double posx[], const double posy[], const bool is_seated, const bool is_group); //--- 結合力計算 ---// double *CalculateCohesion(const int num, const double posx[], const double posy[], const int friends_num, const int friends[]); //--- 一緒にいる人数の判定 ---// int CountWithNum(const int num, const double posx[], const double posy[], const int friends_num, const int friends[]); //--- 距離計算 ----// double E_dis (double xi, double xj, double yi, double yj){ double dis = 0; dis = sqrt((xi-xj)*(xi-xj)+(yi-yj)*(yi-yj)); return dis; } //--- 角度計算 ---// double E_angle (double xi, double xj, double yi, double yj){ double theta = 0; double rx = 0; // x距離 double ry = 0; // y距離 rx = xi - xj; ry = yi - yj; theta = atan2(ry, rx); // 個体間角度計算 return theta; } }; #endif

C++

/* Interaction.cpp */ #include "Interaction.hpp" //--- コンストラクタ定義 ---// Interaction::Interaction(int nn, double sf, double sd, double sa, double cf, double cd){ set(nn, sf, sd, sa, cf, cd); } /* //--- デストラクタ定義 ---// Interaction::~Interaction(){ if(dis != NULL) delete [] dis; if(angle != NULL) delete [] angle; } */ //--- セッタ ---// void Interaction::set(int nn, double sf, double sd, double sa, double cf, double cd){ n = nn; sep_force = sf; sep_dis = sd; sep_angle = sa; coh_force = cf; coh_dis = cd; } //--- 分離力計算 ---// double Interaction::*CalculateSeparation(const int num, const double posx[], const double posy[], const bool is_seat, const bool is_group){ double that_sum[2] = {}; double that_count = 0; double that_ave[2] = {}; double dv_sep[2] = {}; double my_posx = posx[num]; double my_posy = posy[num]; //--- 初期化 ---// that_sum[0] = 0; that_sum[1] = 0; that_count = 0; // 個体間距離と角度の計算 // for(int j = 0; j < n; j++) { if(num == j) continue; if(is_seat) continue; // 着席した人は力の影響を受けない if(is_group == false) continue; // 合流していない人は分離力の影響を受けない // 個体間距離と角度を計算 // dis[j] = E_dis(my_posx, posx[j], my_posy, posy[j]); angle[j] = E_angle(my_posx, posx[j], my_posy, posy[j]); // 分離力の範囲内なら // if(dis[j] <= sep_dis && angle[j] <= sep_angle){ // 範囲内の個体の座標を合計 // that_sum[0] += posx[j]; that_sum[1] += posy[j]; that_count += 1; } } // 範囲内の個体の平均座標 // if(that_count != 0){ that_ave[0] = that_sum[0] / that_count; that_ave[1] = that_sum[1] / that_count; // 分離力 // dv_sep[0] = sep_force * (my_posx - that_ave[0]); // that_sum[0][i]); dv_sep[1] = sep_force * (my_posy - that_ave[1]); // that_sum[0][i]); }else{ // 分離力 // dv_sep[0] = 0; dv_sep[1] = 0; } return dv_sep; } //--- 結合力計算 ---// double Interaction::*CalculateCohesion(const int num, const double posx[], const double posy[], const int friends_num, const int friends[]){ double that_sum[2] = {}; double that_count = 0; double that_ave[2] = {}; double dv_coh[2] = {}; double dis = 0; double angle = 0; double my_posx = posx[num]; double my_posy = posy[num]; for(int k=0; k<friends_num; k++){ if(friends[k] == -1) continue; dis = E_dis(my_posx, posx[friends[k]], my_posy, posy[friends[k]]); angle = E_angle(my_posx, posx[friends[k]], my_posy, posy[friends[k]]); if(dis >= coh_dis){ that_sum[0] += posx[friends[k]]; that_sum[1] += posy[friends[k]]; that_count++; } } // 範囲内の個体の平均座標 // if(that_count != 0){ that_ave[0] = that_sum[0] / that_count; that_ave[1] = that_sum[1] / that_count; // 結合力 // dv_coh[0] = coh_force * (that_ave[0] - my_posx); // that_sum[0][i]); dv_coh[1] = coh_force * (that_ave[1] - my_posy); // that_sum[0][i]); }else{ // 結合力 // dv_coh[0] = 0; dv_coh[1] = 0; } return dv_coh; } //--- 一緒にいる人数の判定 ---// int Interaction::CountWithNum(const int num, const double posx[], const double posy[], const int friends_num, const int friends[]){ double my_posx = posx[num]; double my_posy = posy[num]; int withNum = 0; for(int j=0; j<n; j++) { if(num == j) continue; // 個体間距離と角度を計算 // dis[j] = E_dis(my_posx, posx[j], my_posy, posy[j]); angle[j] = E_angle(my_posx, posx[j], my_posy, posy[j]); if(dis[j] <= coh_dis + friends_num+1){ // 範囲内にいれば for(int k=0; k<friends_num; k++){ // 友人リストに含まれていたら if(friends[k] == j) withNum++; // 合流人数 } } } return withNum; }

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

Zuishin

2021/10/14 10:34

浅いと原因がはっきりしてるならそのボトルネックをなんとかするのが良いと思うんですが。 そんなに突貫工事で作っても使い物にはならないでしょう。
jagaimo0

2021/10/14 11:00

すいません。勉強のために作っているので急に必要なものではありません
BeatStar

2021/10/14 11:15

とりあえず、エラーメッセージは省略せずにちゃんと張った方がいいです。 たまに勘違いしている場合もありますし。
y_waiwai

2021/10/14 11:33

エラーが出たなら、エラーメッセージを提示しましょう エラーメッセージは、いらぬ翻訳省略しないで、出たそのママをコピペで提示してください
jagaimo0

2021/10/14 13:04

ご指摘通り伝わりにくかったと思います。 原文のままに修正しました。ありがとうございます
BeatStar

2021/10/14 13:46

このメッセージはozwkさんの仰るように#ifndef(← nが付いている方)に変えた時のものでいいんですよね?
jagaimo0

2021/10/14 14:08

はい。その通りです
BeatStar

2021/10/14 14:17

さすがにhppファイルとcppファイルが別のところにあるってことは無いですよね?
jagaimo0

2021/10/14 14:55

はい、同じところにあります。
yuki23

2021/10/14 15:30

実行環境とコンパイルに使ったコマンドを記載してください
jagaimo0

2021/10/14 16:20

記載しました
dodox86

2021/10/15 00:07 編集

問題としているエラーとは直接関係ないのですが、提示のコードで、 > #Interaction.hpp が気になります。不正なプリプロセッサ命令としてエラーになると思うのですが、これは直っている前提で話が進んでいるのでしょうか。※もしかすると質問文に見出し(マークダウン)で含むつもりだったけど、コードの方に入っちゃった、ということかな?
jagaimo0

2021/10/15 02:56

分かりにくくてすいません。ファイル名を記載した方がいいかなと思って書きました。 その通りで、実際のコードには含まれていません。
dodox86

2021/10/15 02:59

> 分かりにくくてすいません。ファイル名を記載した方がいいかなと思って書きました。 そういう場合はC++の文法にのっとってコメントの一部などとして書きます。 // Interaction.hpp とか /* Interaction.hpp */ です。マークダウン記法でかかれたコードブロックのコードは、多くの方がソースコードそのものとして読みます。そこへ注釈も無しに独自の記法を混ぜると、混乱や誤解を呼びます。
jagaimo0

2021/10/15 03:15

修正しておきます。ありがとうございます
BeatStar

2021/10/15 03:31

他の回答者のifndefに書き換えに対するコメントで『排除されているメッセージもある』とのことなので、『修正後のメッセージも』載せた方がいいですね。 前提が変わっている可能性もあるので。(一つ目のエラーを直すと二つ目以降の理由ががらりと変わることもしばしば)
jagaimo0

2021/10/15 04:14

はい。修正後のエラーメッセージが上記に記載したものです。
fana

2021/10/15 04:23

とりあえず, 「それは delete できねぇだろ」 だとか 「is_seated って何ですか? 意味わかんないんですけど.よもや is_seat の間違いでは?」 だとかいう, しょーもないエラーくらいはさっさと自分で潰せばよいのでは????????
fana

2021/10/15 04:26

> use of undeclared identifier 'n' とかいう素朴すぎるエラーの{意味,これが出てきた原因,対処方法}等,とにかく全くわからない! とかいう話なのですか? ??? ?????
jagaimo0

2021/10/15 04:31

すみません。 聞きたいところは未定義エラーがなぜ出てきているかです。 エラーの意味は理解していますが、なぜそのエラーが出てきているのかが分からないです。
jagaimo0

2021/10/15 04:34

ご指摘通り、自力で解決できる部分については解決して訂正しました。
Zuishin

2021/10/15 04:36

> Interaction.cpp:41:22: error: use of undeclared identifier 'n' これは自力でできませんか?
Zuishin

2021/10/15 04:38

> 聞きたいところは未定義エラーがなぜ出てきているかです。 上のエラーは n が宣言されていないので出ています。 どこで宣言されていますか? 探してみてみつからなければ宣言されていないのでは?
ozwk

2021/10/15 04:44

> Zuishinさん n はメンバ変数です。 宣言されているはず(ifndefにしたことで解決済み)なのに なぜ宣言されていないことになっているんだ?ということかなと (そしてその答えが*の位置が違う)
BeatStar

2021/10/15 04:53

あら、メッセージが変わってたわ。
Zuishin

2021/10/15 04:55

どこで宣言されているか探すのも面倒だったので聞きましたが、メンバ変数だったんですね。 メソッドの書き方がおかしいためにメソッドと認識されていなかったということですか。
jagaimo0

2021/10/15 04:56

はい。*の位置を直して未定義関係のエラーは消えました。
matukeso

2021/10/15 05:18

もう質問自体は解決してるよね? ifdef違いでhppが消えていた+ポインタの*の位置が違ってメンバ関数扱いされなかった、が理由。
dodox86

2021/10/15 05:21

なぜこんなに引っ張る・解決しないのかわかりませんが、コードを書くときはコンパイルしないままいきなり全部書くのではなく、少し書いて(<コンストラクタだけ、デストラクタだけとか)コンパイル、実行を確認し、少しずつ追加して進めます。間違えたままたくさんコードを書いて大量のエラーに悩まされることが少なくなります。
fana

2021/10/15 05:23

> n はメンバ変数です 他の未定義はあからさまに * 関連だと見えても,nだけはローカル変数の未定義だと思っていた. 今は反省している.
jagaimo0

2021/10/15 05:24

はい。最初にわからなかった部分は解決できました。 おっしゃる通りです。最初warningメッセージが出ていたんですけど、エラーが出ていなくて、無視して進めてしまったために、たくさんエラーが出てしまいました。

まだ回答がついていません

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

コンストラクタ

オブジェクト指向言語において、オブジェクトを生成時に呼び出され、データの初期化などを行なう関数・メソッドのことである。

C++

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