2014-11-14 2 views
4

Я начинающий программист на C++ и выполняю PoC для своей компании. Поэтому я извиняюсь за свой основной вопрос.Вызов нестатической переменной из статической функции

class TestOne{ 
    private: 
    TestTwo* t2; 

    void createInstance(TestTwo* param){ 
    t2 = param; 
    } 

    static void staticFunctionToAccessT2(){ 
    // Now here I want to access "t2" here in the current instance of the class 
    // By current instance I mean "this" in non-static context 
    // currently there is no function to get object, but can be created 
    // ** we cannot call new TestOne(), because that will create a new instance 
    // ** of the current class and that I don't want. 
    } 
} 

Любая помощь в этом отношении будет принята с благодарностью.

Благодаря

=== UPDATE ===

Это может быть принято в качестве сценария, в котором я занимаюсь разработкой приложений в Qt Creator, где у меня есть статическая функция предопределенной подписи и хочу доступ к элементам пользовательского интерфейса для изменения текста (например, TextEdit)

+3

Первое, это не C++. Во-вторых, совершенно не имеет смысла обращаться к некоторой переменной для каждого объекта без объекта. – chris

+0

Извините, Крис, но я на самом деле программист на Java, поэтому я допустил ошибку, я обновлю пример кода. Спасибо, что указали это. – Jayesh

+0

В статической функции нет «текущего экземпляра». Это то, что статично. Если вы хотите, чтобы там был экземпляр, либо отбросьте 'static', либо передайте его функции другим способом. –

ответ

1

Вы не можете этого сделать, даже на Java.

Методы - это просто локальные вспомогательные функции для всех экземпляров класса без доступа к отдельному состоянию класса (например, t2).

Либо удалить метод static из метода, либо внести переменную-член в переменную static, в зависимости от того, что вы пытаетесь выполнить.

EDIT:

Если я вас правильно понял ваш SDK хочет указатель на функцию, которая будет вызывать изменить ваши экземпляры t2. Ваш метод мутатора должен быть public и не static. Так что давайте просто скажем, что вы переопределены staticFunctionToAccessT2 так:

public: void mutateT2(); 

Если экземпляр вы хотите позвонить mutateT2 на определен как:

TestOne foo; 

Где ваш SDK хочет указатель функции вы могли бы передать это в:

std::bind(&TestOne::mutateT2, foo) 

Как указал Mike Seymour ниже это работает только если параметр метода SDK является std::functionне, если его параметр является необработанным указателем функции.

+0

Если он хочет указатель на функцию, то вы не можете дать ему результат 'bind'; это тип класса, содержащий связанные значения, поэтому не конвертируемый в простой указатель функции. Невозможно передать дополнительное состояние, если оно принимает только указатель на функцию. –

+0

@MikeSeymour Это зависит от типа параметра. Например, слоты Qt принимают тип 'std: function', который будет принимать вывод' std :: bind'. Я подозреваю, что это [Jayesh] (http://stackoverflow.com/users/1093333/jayesh) использовал свою функцию. –

+0

Действительно, если тип параметра «std :: function» или аналогичный, то он примет любой вызываемый объект. Но если он хочет указатель на функцию, то вы не можете использовать 'bind', в отличие от последнего предложения вашего ответа. –

0

Статическая функция-член не имеет «текущего экземпляра».

Если вы хотите ограничить свой класс тем, что у вас есть только один экземпляр, вы ищете шаблон с синглтон-дизайном (анти-), Singleton pattern in C++. На самом деле это не зло, и я всегда ощущаю в нем привлекательность всякий раз, когда я работаю с классами, имеющими статические переменные-члены.

Существует ряд подходов к улучшению работы синглтона, поэтому пристальное внимание к RAII должно быть вашей главной целью здесь, и я использую std::unique_ptr<TestOne> safeInstance;, пока я инициализирую свой статический метод getInstance(), в отсутствие исключений на моем Android-устройстве Окружающая среда.

Я обычно призываю вас не использовать Шаблон Singleton, если у вас есть недостаточный опыт, чтобы задать этот вопрос. Но, похоже, это касается большинства вопросов вашего вопроса.

Дополнительно, для вызова нестатической «переменной», я предполагаю, что вы имели в виду «метод», ваша статическая функция должна работать с вашим экземпляром singleton, при условии, что он был успешно создан. Он может даже доступ нестатический переменная через экземпляр singleton.

0

Нет «текущего экземпляра»; вы не можете получить доступ к нестационарным элементам из статической функции без доступа к каким-либо экземплярам где-нибудь.

Из ваших комментариев кажется, что вы используете сломанный API с механизмом обратного вызова (или аналогичного), который не передает данные пользователя функции, которую вы предоставляете. В этом случае вам нужно будет найти другой способ получить данные в функции; возможно, статический член:

static TestOne * bodge; 
static void staticFunctionToAccessT2(){ 
    TestTwo * t2 = bodge->t2; 
} 

поэтому API можно использовать константы выглядит

TestOne::bodge = my_t1; 
broken_api(&TestOne::staticFunctionToAccessT2); 

Будьте осторожны, чтобы не установить bodge на некоторое другое значение, пока API не закончит то, что он делает с обратного вызова.

Менее сломанный API будет определять тип обратного вызова, который может принимать параметр «пользовательские данные»; возможно, указатель void*, который может указывать на произвольные данные. Вы можете использовать это таким образом:

static void staticFunctionToAccessT2(void * p) { 
    TestOne * t1 = static_cast<TestOne*>(p); 
    TestTwo * t2 = t1->t2; 
} 

less_broken_api(&TestOne::staticFunctionToAccessT2, my_t1); 

Хороший современный API будет принимать произвольные типы вызываемые, так что вы можете использовать не статическую функцию:

void memberFunctionToAccessT2() { 
    TestTwo * t2 = this->t2; 
} 

nice_api([=]{my_t1->memberFunctionToAccessT2();}); 
Смежные вопросы