ページ 11

静的メンバに関数ポインタを使いたい.

Posted: 2015年10月25日(日) 23:04
by Debt
C++のクラスについての質問です.

静的メンバに関数ポインタを使いたいのですがエラーが出てしまいます.

コード:

double loss(double* x)
{
	return x[0];
}

class MyClass
{
public:
	static double(*func)(double*);
};
double (MyClass::*func)(double*);

int main()
{
	MyClass::func = loss;
}
error LNK1120: 1 unresolved externals
error LNK2001: unresolved external symbol "public: static double (__cdecl* MyClass::func)(double *)" (?func@MyClass@@2P6ANPAN@ZA)

関数ポインタの宣言が悪いのかなとも思うのですが,構文の間違いがわかりません.

どうか教えてください.よろしくお願いします.

Re: 静的メンバに関数ポインタを使いたい.

Posted: 2015年10月25日(日) 23:20
by みけCAT
とりあえず*の位置を移動したらコンパイルが通りました。

コード:

double loss(double* x)
{
	return x[0];
}

class MyClass
{
public:
	static double(*func)(double*);
};
double (*MyClass::func)(double*);

int main()
{
	MyClass::func = loss;
}

Re: 静的メンバに関数ポインタを使いたい.

Posted: 2015年10月25日(日) 23:34
by Debt
解決しました!
ありがとうございます.

Re: 静的メンバに関数ポインタを使いたい.

Posted: 2015年10月26日(月) 03:32
by かずま
解決しました、というのは、理解できたということでしょうか?
それとも、コンパイルできて、思い通りに動いただけということでしょうか?

double (*MyClass::func)(double*); ---(1)
double (MyClass::*func)(double*); ---(2)

どちらも構文上は存在します。

(2) がコンパイルできるのは次の通り。

コード:

class MyClass
{
public:
    double loss(double* x)
    {
        return x[0];
    }
};

double (MyClass::*func)(double*);
 
int main()
{
    func = &MyClass::loss;
}
(1) と (2) の違いが説明できればいいんですが、どうでしょう?

double (*MyClass::func)(double*); ---(1)

func は、MyClass のメンバである。
func は、ポインタである。
そのポインタは関数を指している。
その関数は、引数が doulbe * で、返却値が double である。

double (MyClass::*func)(double*); ---(2)

func は、MyClass のメンバではない。
func は、MyClass のメンバへのポインタである。
そのメンバは関数である。
そのメンバ関数は、引数が doulbe * で、返却値が double である。