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

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

新規登録して質問してみよう
ただいま回答率
85.49%
C++

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

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

Q&A

解決済

3回答

3953閲覧

Arduinoでオブジェクト指向

PHENIXa

総合スコア47

C++

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

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

0グッド

0クリップ

投稿2020/12/31 09:56

Arduinoでオブジェクト指向を勉強中なのですが、自作したプログラムがエラーになります。
仕様としては5に3を足して返してその値をシリアルで表示するという単純なものです。

何が間違っているのでしょうか?

該当のソースコード

//ヘッダーファイル //sumple.h #ifndef _sumple_h #define _sumple_h #include "Arduino.h" class Csumple{ public: void set(int data); int GET(void); private: int data; }; #endif
//ソースファイル //sumple.cpp #include "Arduino.h" #include "sumple.h" Csumple::Csumple(int pin) // コンストラクタ(初期化処理) { pin=0; } Csumple::set(pin){ data = pin + 3; } int Csumple::GET(){ return data; }
//メイン //main.ino //数値を渡してその値に3を足して返すプログラム #include"Arduino.h" #include"sumple.h" Csumple a; //インスタンス生成 void setup() { Serial.begin(9600); } void loop() { int num=5; a.set(num); Serial.println(a.GET()); }

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

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

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

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

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

y_waiwai

2020/12/31 09:59

エラーが出るならエラーメッセージを提示しましょう また、Arduinoのなにを使ってるんでしょうか。
episteme

2020/12/31 10:00

「エラーになります」を説明しなさい。 なにをしたら/どこで/どんなエラーになりますか? エラーメッセージが出力されたなら、それをそのまま呈示しなさい。
PHENIXa

2020/12/31 11:20

すみません。エラーメッセージを追記します
guest

回答3

0

そもそもオブジェクト指向というのは、コンピュータ資源をじゃぶじゃぶ使って、ニンゲンがわかりやすいよーにコードの構成を組むことができる、という環境です。
なので、資源が極端に限られてるArduinoを使ってそれを勉強するというのはムリムリかと思います。

素直にPCを使って勉強しましょう。

投稿2020/12/31 13:52

y_waiwai

総合スコア87747

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

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

0

自己解決

回答をいろいろもらいましたが、まともな回答をして頂ける方(女又)が少ないので自己解決しました。

thkanaさん曰くteratailはエンジニア専用サイトらしいのでこんなことは知っていて当然のはずなので解決方法は皆さんは既にご存知と思うのでど素人の私の回答は差し控えさせていただきます。

投稿2020/12/31 15:03

PHENIXa

総合スコア47

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

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

episteme

2020/12/31 15:15 編集

まともな回答ならついてたよ。 「デフォルト(引数なし)以外のコンストラクタを使うなら、宣言と定義をセットで用意してください。」 件のケースではコンストラクタに意味がないから "コンストラクタを宣言/定義しない" が正解でしょね。 # エラーメッセージを示してくんなかったから断言はできんけど、きっとそう。
guest

0

オブジェクト指向を勉強中

クラスはオブジェクト指向プログラミングをやりやすくするための仕掛けですが、クラスを使えばオブジェクト指向になるということは全くないです。今後オブジェクト指向プログラミングをするためにクラスを試している、ということかと思いますが、質問のプログラムがオブジェクト指向的だとかの勘違いはしないように。

一番どうでもいいところからいうと、プログラム言語的には全く問題にならないけれど、英語の問題としてsumpleはちょっと。
あと、習慣的にC/C++で全部大文字の関数名ってあまり使わないかなぁ...
不必要なファイルをインクルードするのもあまりよいことではないと思うし、
インクルードガードには#pragma onceというプリプロセッサ命令も使えるというのは覚えておいても損はないと思います。

とここまでは「間違い」ではないですが、以下本番。

最近のC++は実はシンボルにはUTF-8文字が使えることになっていたりするけれど、あくまでシンボルだけだし、しかもgccはいろいろとあるので、プログラム内では文字列/文字リテラルとコメント以外は
いわゆる半角文字だけで記述しましょう。UTF-8の全角空白(コード0xE3 80 80, 0343 200 200)が紛れ込んでいます。

クラスのメンバ関数の宣言と定義はシグニチャ(戻り値の型、関数名、引数リスト)が一致していなければいけません。これはCでのプロトタイプ宣言と関数定義の関係と同様。

デフォルト(引数なし)以外のコンストラクタを使うなら、宣言と定義をセットで用意してください。
逆に、デフォルトでないコンストラクタを宣言・定義した場合はデフォルトコンストラクタは暗黙的には使えなくなります。引数あり、引数なしのコンストラクタを両方使いたいのなら明示的に宣言定義しましょう。ただし、

C++

1Csumple::Csumple(int pin)// コンストラクタ(初期化処理) 2{ 3 pin=0; 4}

は一体なにをしたいのですか? そこらへんを整理する方が先ですね。

投稿2020/12/31 11:29

thkana

総合スコア7629

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

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

PHENIXa

2020/12/31 11:59

>一体なにをしたいのですか? >コメントに書いてある通りです。そのためのコメントなのでは?
episteme

2020/12/31 12:05 編集

>コメントに書いてある通りです。そのためのコメントなのでは? 初期化処理なのはコメントでわかった。 で、これのどこが初期化処理なの? なにを初期化してるの? って意味で「一体なにをしたいのですか?」と問われているのよ。
thkana

2020/12/31 12:13

では、「初期化処理」ってなに? と聞きましょうか。 初期化した結果、なにがどこに得られるのでしょう?
PHENIXa

2020/12/31 12:13

それがよくわあからないのですが 不明なので、変数(正確には変数ではない?)pinを初期化 一応Arduinoではなくc++で同じようなプログラを記述すると初期化をしなくてもうまくいくのですが。
episteme

2020/12/31 12:23 編集

「一体なにをしたいのですか?」に答えられないのね。 説明できないコードは一行たりとも書いてはならんのだけど。 > 初期化をしなくてもうまくいくのですが。 なら初期化処理なんて要らんやん。なにするかもわかってないんだし。
thkana

2020/12/31 12:19

> それがよくわあからないのですが > 不明なので、変数(正確には変数ではない?)pinを初期化 う~ん。つまり、なんだかなんにもわからないけどそれっぽく文字を並べてみた、ということですか。 > 初期化をしなくてもうまくいくのですが。 うまくいく、とはなにがどうなることでしょう?
PHENIXa

2020/12/31 13:02

仕様のとおりです。 >なんだかなんにもわからないけどそれっぽく文字を並べてみた、ということですか。 はい、そうですけど。それがわからないから質問してるのですが。ここはそういう場なのでは?
thkana

2020/12/31 13:11

"Hello worldを表示するプログラム"が、表示が"Hello world"だったとしても、その内部で1~100までの和を計算していたら、そのプログラムは「仕様通り」と言い切れるでしょうか? では、もう少しミクロに「コンストラクタの関数仕様」を示してください。何を入力として、何を出力...コンストラクタなので戻り値はありませんが、要求される結果とするのでしょう。 > ここはそういう場なのでは? googleでteratailを検索すると"ITエンジニア特化型Q&Aサイト"という副題付きで(まぁ広告ですけど)挙がってきます。エンジニアなら、「なんだかわからないけどそれっぽく文字を並べる」ことは「やってはいけない」でしょう。わからないことはかまいませんが、だからといってめちゃくちゃをやるのはダメです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問