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

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

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

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

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

Q&A

解決済

1回答

2704閲覧

クラス分けをC言語で使用したい

saje

総合スコア17

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

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

0グッド

0クリップ

投稿2020/02/14 07:19

C++にある "クラス分け" をC言語の方でも行えるようにしたいです。
方法をご存じの方、どうかご教授ください。

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

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

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

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

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

maisumakun

2020/02/14 07:24

「クラス分け」とは、「コードをクラスに分ける」ことでしょうか、それとも「プログラムで物事を区分する」ことでしょうか。 …と聞かないといけないぐらいに情報が不足しています。
stdio

2020/02/14 07:28 編集

疑似オブジェクト指向...だと... 行えるかと言えば、行えますが、かなり無理矢理な方法になりますので、お勧めはしません。 素直にC++でいいんじゃないですか... ます、その「クラス分け」とはどのようなイメージですか?
maisumakun

2020/02/14 07:33

そして、どのような理由があってC++ではなくCで行いたいのでしょうか。
saje

2020/02/14 10:14

ご回答ありがとうございます。 私自身理解しきれていないため、説明が不十分となり申し訳ありません。 C言語でクラス分けしたい理由としては、私の所属している団体でロボットの自立走行プログラムを共同制作していて、その言語がCであることと、そのプログラムをモデル図としてかくためです。 プログラムは大きく分けて、センサで読み取った値から算出するものと、動作を支持するものの2種で構成していますが、ポインタや関数のみでは値のやり取りが複雑になり、モデル図にかくとき機能の関連性が見えずらくなってしまいました。 どちらも初心者に手が生えた程度の技術しかないので、C++のようなクラス分けを行えば機能のつながりの明度がわかりやすく、モデル図の書きおこしやプログラム修正が行いやすいと考えています。
Zuishin

2020/02/14 11:02

継承やオーバーロードや多態性が必要無ければあるいは。オブジェクト指向に慣れた人がオブジェクト指向を使いたいというのではなく、ただただデータをまとめたいだけではありませんか?
hayataka2049

2020/02/14 12:57 編集

モデル図は適当に抽象化して書けば良いのでは? それより、何があるCなのかが気になります。スレッドは使えるのか、OSは存在するのか……実装の方針がある程度は詳しくわからないと回答のつきようもないと思いますよ。 // フリースタンディング環境でwhile(1)を書くとそれがメインループという環境かもしれない
saje

2020/02/17 03:04

>>Zuishinさん 継承やオーバーロードなどは、センサーの値に応じた動きを指定しているため、かなり利用しています。 データをまとめたいだけかと言われると、そうと言えます。 >>hayataa2049さん OSはTOPPERSです。スレッドは現在1つで、タスク分割が出来ていない状態です。
Zuishin

2020/02/17 03:16

だったら環境が許せば素直に C++ を選ぶのがいいと思います。
saje

2020/02/17 03:30

>>Zuishinさん C++はほとんど触ったことがないのですが、そちらで行ってみるようにしてみます。
saje

2020/02/17 05:30

>>Zuishinさん 参考ありがとうございます! ぜひ試させていただきます
guest

回答1

0

ベストアンサー

こんにちは。

「クラス分け」の意味が広すぎてイマイチ分からないのですが、オブジェクト指向で設計する際に、どのようなクラスに分けるのか決める必要があります。その意味でしょうか?
その場合、C言語でもクラスを使いたいという意味と思います。

C++はC言語を拡張してクラスを使えるようにした言語です。(他にも様々な拡張がありますが。)
ですので、C++のクラス機能を使うのがベストですよ。

どうしてもC言語でクラスを使いたいのであれば、structを使い倒す感じになります。
structをクラスっぽくするには、structにメンバー関数を定義できることが基礎です。そのstruct名をプリフィックスとした関数を用意し、先頭パラメータとして当該structへのポインタをthisとして受け取ると良いです。

C

1typedef struct 2{ 3 int bar; 4} Foo; 5 6void Foo_construct(Foo* this) 7{ 8 this->bar=0; 9}

投稿2020/02/14 07:44

Chironian

総合スコア23272

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

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

saje

2020/02/14 10:29

ご回答ありがとうございます。 仰るとおりで、オブジェクト指向で行うときクラスが難しく、この考えに至りました。 structも話し合いの中で上がったのですが、C++のものの方が理想に近かったのでどうにかできないかと思っていましたが、アドバイスいただきましたように、structのことももう一度皆で話し合い考え直そうと思います。 しかし、structでもC++のクラスほどの関連度を作り出すのは難しいでしょうか?
episteme

2020/02/14 11:55 編集

C++でいうところのclassをstructでなんとかしようとすると 継承したいなら必然的にcastの嵐になるし、仮想関数がアホほど めんどくせーので 可読性が落ちて使いもんにならんです(何度かやってみたけど)
Chironian

2020/02/15 03:00 編集

sajeさん C++のクラスは他の言語と比べても特に難しいというものではないですよ。C++の全ての機能を使おうとすると、その学習難易度の高さに挫折する人が大半ではないかと感じます。しかし、理解できた部分から使って行けば大丈夫と思います。ベターC(より便利なC言語)としてC++を捉えるのです。 さて、epistemeさんもおっしゃってますように、オブジェクト指向プログラミングをするのであれば、オブジェクト指向のサポートが強力な言語を使わないと非常に厳しいです。 linuxのカーネルは、C言語でオブジェクト指向的なプログラミングされています。きれいなコードですが、可読性は厳しいです。C言語で実装する仮想関数の読み悪さは鬼です。非オブジェクト指向言語でオブジェクト指向プログラミングを行うことの厳しさが垣間見えると思います。
stdio

2020/02/17 03:21

私も今のプロジェクトでC言語でオブジェクト指向的なプログラミングをしているソースコードをよく目にしますが、綺麗なコードかなと思って読んでみると、色々問題があり、本当にガタガタな感じで動いているのだなと常に思っております。voidポインタとかいう劣悪なものまで利用しますので、一度不具合が出れば、直すのに一苦労しております。 ですので、お勧めはしません。ロボットにc++を組み込めるのなら、間違いなくc++の方が良いかと思います。
saje

2020/02/17 03:22 編集

>>epistemeさん、Chironianさん、stdioさん やはり難しいですか...。 思い切ってC++で挑戦してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問