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

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

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

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

Q&A

5回答

1252閲覧

c言語で、プログラミング言語を作ってるけどオブジェクト指向が、実装できない

tomato__111

総合スコア0

C

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

0グッド

4クリップ

投稿2024/06/28 08:23

c言語で、オブジェクト指向の、実装の仕方

私の趣味でプログラミング言語を、作っています、ですがオブジェクト指向だけが、実装できなくて困っています

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

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

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

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

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

maisumakun

2024/06/28 08:31

今までに実装できた機能にはどのようなものがありますか?
fana

2024/06/28 09:00

「オブジェクト指向を実装できた」ということになるための条件とは何ですか? 何がどうなれば達成されるのですか? まずそこを具体的に述べる(というか定義する)ところから開始する必要があるのでは? とか思うのですが,どうなんでしょう? 「オブジェクト指向」とだけ述べればそれで世間一般には過不足なく話が伝わるものなのでしょうか?
tomato__111

2024/06/28 11:50

今までに実施したのは、for文、if文、関数、変数、print関数を、実装しました pythonのように、class内で変数が、引数に、入れなくても使えたり、関数が、class内ならどこからでも呼び出すことができるようにすればokです
TakaiY

2024/06/28 14:35

その言語そのものが、どのように実装されているのかわからなければ答えようがないように思いますが、そうなるとここでやりとりできる難度を越えているように思います。 > 変数が、引数に、入れなくても使えたり これは、Object指向というより、変数のスコープや名前空間の話のように思います。 > 関数が、class内ならどこからでも呼び出すことができる 通常のメソッド(クラスのメンバー関数)はclass外からも呼べるのが通常ですけど、これも、変数のスコープの問題でしょうか。 pythonもclass内の関数はself.method_name()の形であり、外から呼ぶのと同じ形式になってますね。 いずれも変数や関数を言語としてどのように実装してどのように管理しているかあたりとかかわりますね。
JunSuzukiJapan

2024/07/02 01:39

コンパイラですか? インタープリタですか?
pecmm

2024/07/04 13:53

コメントの質問へ回答されている内容は、質問本文にも編集して追記された方が良いと思われます。
guest

回答5

0

ありがちな実装方法としては、以下のようなものがあります。

  1. 自作言語に構造体を実装して、クラスの実体として使用する。
  2. メソッドを、自分自身の型を受け取る隠し引数を先頭に追加した、通常の関数として定義する。
  3. メソッドを呼び出す際に、先頭の隠し引数に自分自身を渡す。
  4. メソッド内で使われている変数がローカル変数でなければ、隠し引数で受け取った構造体のメンバから探して参照する。そこにも無ければグローバル変数から探す。
  5. メソッド内で呼び出されている関数については、まず同じクラスのメソッドから探す。該当メソッドがなければ、通常の関数から探す。

メソッド内からインスタンス変数や他メソッドが使えているように見えるのは、そう見えるように実装しているだけにすぎません。

投稿2024/07/07 05:05

actorbug

総合スコア2429

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

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

0

今までに実施したのは、for文、if文、関数、変数、print関数を、実装しました

現時点で関数,変数を実装できているのであれば、既に名前解決ができるなんらかの仕組みを用意されているのだと思います。
今実装されている関数がlexicalスコープである(つまり関数呼び出し元と呼び出し先でそれぞれ別の名前解決ができる環境を持つ)ならば、既に名前解決のための環境を切り替える仕組みがあるわけですので、それの延長発展でいけそうな気がします。

もしdynamicスコープだったりglobalしかないとかであれば……
オブジェクトやクラスを考える以前に、まずは昨今のプログラミング言語で採用されているlexicalなローカルスコープを真似してみて
1つの関数内でもブロックごとに新たなローカルスコープを作成し、ネストしたブロックは階層化された名前解決(同一階層で解決できなければより外を探索しにいく)みたいな仕組みなどを目指すとよいんじゃないでしょうか。

投稿2024/07/04 13:53

pecmm

総合スコア722

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

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

0

私自身はプログラミングが得意ではないのでよく分かりませんが,
C言語でオブジェクト指向を最初から指向して実装しているといえば,
老舗ではRuby言語になるのではないかと思います。

ソースが公開されているので参考されてはどうでしょうか?

オブジェクト指向の言語の場合,「オブジェクトとは何か?」の定義から入るので,
(この辺りthkanaさんの指摘通り)この辺りの定義をどうやっているかとかが
参考になるのではと思います。

投稿2024/06/29 01:01

ujimushi_sradjp

総合スコア2152

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

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

0

Luaのオブジェクト指向対応のやり方を参考にすると比較的軽そうな気がする。Lua真面目に使ったことがないし、気がするだけだけど。

class内で(略)

クラスのインスタンス毎にそれぞれのストレージ(メモリ領域)とその内容へのテーブルを持てばなんとかならんか。

今までに実施したのは(略)

多分、テクニック的には「構造体」を実装してみると今後の参考になりそうな。ご存じかと思いますがC++ではCの構造体ベースにクラスを実現していますから。

投稿2024/06/28 23:47

thkana

総合スコア7703

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

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

0

残念ながら、C言語ではオブジェクト指向には対応しておりません。

素直に、オブジェクト指向の言語を選んでそれに実装しましょう

投稿2024/06/28 22:22

y_waiwai

総合スコア88042

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

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

TakaiY

2024/06/29 02:22

C言語を使って*新な言語*を作ってそこにオブジェクト指向を取り入れたいということなので、この指摘はあたらないと思いますよ。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問