C言語の関数ポインタを用いたメンバ関数もどきの実装について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
toku

C言語の関数ポインタを用いたメンバ関数もどきの実装について

#1

投稿記事 by toku » 9年前

ただいまC言語の関数ポインタについて勉強をしています。
構造体で関数ポインタを宣言することで、任意の関数を実行することまではできました。
そこで、次にC++のメンバ関数のように、その関数を実行することで構造体内のメンバ変数を操作するような関数を作成したいと考えています。

現在、以下のようなコードを作成しています。
このコードでは引数に構造体のメンバ変数を与えなければ動作しません。
そこで、data.add()と実行するとx+yをリターンするような関数を作成できないかと考えています。
そのためには、引数を取らずに構造体内の変数へアクセスする必要がありますが、そのような関数を作る方法が思い浮かびません。
グローバル変数を作成する以外でそのような関数を実装する方法はあるのでしょうか?

ご返答いただければ幸いです。

コード:

#include<stdio.h>
typedef struct{
        int x;
        int y;
        int (*add)(int x,int y);
}calc;

int plus(int x, int y){
        return x+y;
}

int main(){
        calc data;
        data.x=1;
        data.y=2;
        data.add = plus;
        printf("%d",data.add(data.x,data.y));
        return 0;
}

アバター
MoNoQLoREATOR
記事: 284
登録日時: 14年前
住所: 東京

Re: C言語の関数ポインタを用いたメンバ関数もどきの実装について

#2

投稿記事 by MoNoQLoREATOR » 9年前

コード:

#include<stdio.h>
struct calc{
	int x;
	int y;
	int(*add)(const calc & self);
};

int plus(const calc & self) {
	return self.x + self.y;
}

int main() {
	calc data;
	data.x = 1;
	data.y = 2;
	data.add = plus;
	printf("%d", data.add(data));
	return 0;
}
ではダメでしょうか?
全く引数を受け取らずに実現する方法は、私が知る限りでは存在しません。

かずま

Re: C言語の関数ポインタを用いたメンバ関数もどきの実装について

#3

投稿記事 by かずま » 9年前

MoNoQLoREATOR さんが書きました:ではダメでしょうか?
参照が使えるのは C++ ですね。
C だとポインタで渡すことになります。

コード:

#include <stdio.h>

typedef struct calc {
    int x;
    int y;
    int (*add)(struct calc *);
} calc;
 
int plus(calc *this_)
{
    return this_->x + this_->y;
}
 
int main(void)
{
    calc data;
    data.x = 1;
    data.y = 2;
    data.add = plus;
    printf("%d\n", data.add(&data));
    return 0;
}
C++ も this ポインタを持っていて、同じようなことをしていますね。
this をレジスタで渡すようですが。

toku

Re: C言語の関数ポインタを用いたメンバ関数もどきの実装について

#4

投稿記事 by toku » 9年前

お二方からの回答ありがとうございます。
やはり、引数に自身のポインタを渡すしかないのですね。

教えていただいた方法をもとにプログラムを作成していこうと思います。
本当にありがとうございました。

閉鎖

“C言語何でも質問掲示板” へ戻る