ページ 1 / 1
C言語の関数ポインタを用いたメンバ関数もどきの実装について
Posted: 2016年6月22日(水) 00:03
by toku
ただいま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;
}
Re: C言語の関数ポインタを用いたメンバ関数もどきの実装について
Posted: 2016年6月22日(水) 11:15
by MoNoQLoREATOR
コード:
#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言語の関数ポインタを用いたメンバ関数もどきの実装について
Posted: 2016年6月22日(水) 12:28
by かずま
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 をレジスタで渡すようですが。
Re: C言語の関数ポインタを用いたメンバ関数もどきの実装について
Posted: 2016年6月22日(水) 21:27
by toku
お二方からの回答ありがとうございます。
やはり、引数に自身のポインタを渡すしかないのですね。
教えていただいた方法をもとにプログラムを作成していこうと思います。
本当にありがとうございました。