Как получить доступ к другой переменной экземпляра класса внутри статической функции - PullRequest
0 голосов
/ 18 ноября 2010
//ClassA.h
Class ClassA
{
    private:

    UtilityClass utilityCls; // this is the instance that I need to access

    virtual void Read();
    static bool IsValid(char c);

}

//ClassA.cpp
void ClassA::Read()
{
    ....
    string str = "abcdefg"; // sample only
    if(find_if(str.begin(), str.end(), IsValid) == str.end())
    {
        ....
    }
}

inline bool IsValid(char c)
{
    // There are compile errors When I call functions of Utility class here
    // Ex: utilityCls.ProcessData();

    return (isalpha(c)); // sample only
}

Мне действительно нужен доступ к "utilityCls" внутри функции "IsValid".Есть ли простой способ сделать это?Или есть другой способ или обходной путь?Извините, если это глупый вопрос.Пожалуйста, помогите мне, ребята ...

Ответы [ 5 ]

1 голос
/ 18 ноября 2010

Статические функции класса на самом деле являются мета-функциями: функциями, которые полезны для класса в целом, но не для какого-либо конкретного объекта класса. Таким образом, у них нет никакого способа получить доступ к членам конкретного объекта, в частности, им не хватает неявного указателя this, который содержится в большинстве функций-членов.

Если вам нужен статический класс для доступа к членам объекта, вы должны явно передать указатель или ссылку на объект. Обычно лучше сделать функцию нестатичной.

P.S. Ваше определение IsValid неверно, оно должно быть inline bool ClassA::IsValid(char c).

1 голос
/ 18 ноября 2010

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

Как это:

class ClassA
{
    private:

    UtilityClass utilityCls; // this is the instance that I need to access

    virtual void Read();

  struct IsValid : public std::unary_function<char, bool>
  {
    IsValid(UtilityClass& utility) : utility_(utility) {};
    bool operator()(char c) const 
    {
      return utility_.ProcessData(c);
    }
  };
};

Используйте это так:

void ClassA::Read()
{
    ....
    string str = "abcdefg"; // sample only
    if(find_if(str.begin(), str.end(), IsValid(utilityCls)) == str.end())
    {
        ....
    }
}
1 голос
/ 18 ноября 2010

Статическая функция-член относится к классу , а не к любому экземпляру этого класса.Это очень похоже на глобальную функцию, которая была объявлена ​​другом класса (с нечетным именем, включающим имя класса, прикрепленное спереди).

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

1 голос
/ 18 ноября 2010

У вас есть статическая функция.Как вы собираетесь получить доступ к переменным-членам?Либо сделайте переменную статической, либо функцию нестатической.

0 голосов
/ 18 ноября 2010

Вы не можете получить доступ к переменной instance без предварительного создания экземпляра класса.Либо сделайте IsValid нестатичным, либо добавьте код в ваш статический метод, например

Class a;a.utilityCls.ProcessData ();

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...