web-dev-qa-db-ja.com

C ++静的メソッドを呼び出す方法

JavaのようにC++の静的メソッドからオブジェクトを返すことは可能ですか?私はこれをやっています:

class MyMath {
    public:
       static MyObject calcSomething(void);
    private:
};

そして私はこれをしたい:

int main() { 
    MyObject o = MyMath.calcSomething(); // error happens here
}

MyMathクラスには静的メソッドしかないため、インスタンス化しても意味がありません。しかし、私はこのコンパイルエラーを受け取ります:

MyMath.cpp:69:エラー:「。」の前にプライマリ式が必要です。トークン

私は何が間違っているのですか? MyMathをインスタンス化するためにhaveを実行しますか?可能であれば、したくないです。

29
Lee

_::_の代わりに_._を使用する

MyObject o = MyMath::calcSomething();

クラスのオブジェクトなしでメソッドを呼び出す場合は、_::_表記を使用する必要があります。クラスオブジェクトまたはそれらへのポインターを介して静的メソッドを呼び出すこともできます。この場合、通常の_._または_->_表記を使用する必要があります。

_MyObject obj;
MyObject* p = new MyObject();

MyObject::calcSomething();
obj.calcSomething();
p->calcSomething();
_
74
Paul

私は何が間違っているのですか?

間違った構文を使用しているだけです...::演算子( スコープ解決演算子 )は、異なる名前空間のクラスまたはメンバーにアクセスする方法です。

int main() { 
    MyObject o = MyMath::calcSomething(); // correct syntax
}

MyMathをインスタンス化する必要がありますか?

番号。

12
John Rasch

この場合、My Math :: calc Something()が必要です。 '。'構文は、オブジェクト内の関数を呼び出すためのものです。 ::構文は、クラスまたは名前空間で関数を呼び出すためのものです。

1
Michael Kohne

MyMath::calcSomething()を呼び出します

1
Marten

この方法を試してください

#include <iostream>
using namespace std;
class MyMath {  
public:
    static MyMath* calcSomething(void);
private:
};
MyMath* MyMath::calcSomething()
{
    MyMath *myMathObject=new MyMath;
    return myMathObject;
}
int main()
{   
    MyMath *myMathObject=MyMath::calcSomething();
    /////Object created and returned from static function calcSomeThing   
}

ありがとう