Как вызвать статический метод C ++ - PullRequest
29 голосов
/ 30 июля 2009

Можно ли вернуть объект из статического метода в C ++, как в Java? Я делаю это:

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

И я хочу сделать это:

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

В классе MyMath есть только статические методы, поэтому нет смысла его создавать. Но я получаю эту ошибку компиляции:

MyMath.cpp: 69: ошибка: ожидаемое первичное выражение перед '.' лексема

Что я делаю не так? У меня есть для создания экземпляра MyMath? Я бы предпочел нет, если это возможно.

Ответы [ 5 ]

74 голосов
/ 30 июля 2009

Используйте :: вместо .

MyObject o = MyMath::calcSomething();

Когда вы вызываете метод без объекта класса, вы должны использовать :: нотацию. Вы также можете вызывать статический метод через объекты класса или указатели на них, в этом случае вы должны использовать обычную запись . или ->:

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

MyObject::calcSomething();
obj.calcSomething();
p->calcSomething();
12 голосов
/ 30 июля 2009

Что я делаю не так?

Вы просто используете неправильный синтаксис ... оператор :: ( оператор разрешения области действия ) - это способ доступа к классам или членам в разных пространствах имен:

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

Должен ли я создавать экземпляр MyMath?

номер

1 голос
/ 23 мая 2013

Попробуйте вот так

#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   
}

Спасибо

1 голос
/ 30 июля 2009

Звоните MyMath::calcSomething()

1 голос
/ 30 июля 2009

Для этого случая вы хотите MyMath :: calcSomething (). "." синтаксис для вызова функций в объектах. Синтаксис :: предназначен для вызова функций в классе или пространстве имен.

...