Как переместить структуру в класс? - PullRequest
3 голосов
/ 29 марта 2010

У меня есть что-то вроде:

typedef struct Data_s {
  int field1;
  int field2;
} Data;

class Foo {
  void getData(Data& data);
  void useData(Data& data);
}

В функции другого класса я мог бы сделать:

class Bar {
  Data data_;
  void Bar::taskA() {
    Foo.getData(data_);
    Foo.useData(data_);
  }
}

Есть ли способ переместить Данные из глобальной области видимости в Foo, не создавая новый класс? Данные отражают структуру, существующую в библиотеке, которую я использую в другом месте. (То есть те же поля, только другое имя. Позже я приведу Data к другой структуре. Я делаю это потому, что Foo является абстрактным классом, а производный класс, использующий библиотеку, является лишь одним из многих).

В настоящее время просто вставить его в класс и заменить Data на Foo::Data везде не работает.

class Foo {
  typedef struct Data_s {
    int field1;
    int field2;
  } Data;
  ...
}

Я получаю 'Data' in class 'Foo' does not name a type в Bar data_;

Ответы [ 2 ]

4 голосов
/ 29 марта 2010

Вы можете определить структуру внутри класса, но вам нужно сделать это раньше, чем вы впервые ее используете. Структуры, как и сами классы, должны быть объявлены заранее, чтобы использовать их:

class Foo
{
public:
    struct Data
    {
        int field1;
        int field2;
    };

    void getData(Foo::Data& data) {}
    void useData(Foo::Data& data) {}
};

void UseFooData()
{
    Foo::Data bar;
    Foo f;
    f.getData(bar);
    f.useData(bar);
}

Редактировать: Обновлен пример использования тех же полей / имен классов, которые указаны в исходном вопросе. Обратите внимание, что для того, чтобы быть видимым вне класса Foo, необходимо объявить Data public, а другой код должен ссылаться на него как Foo::Data.

2 голосов
/ 29 марта 2010

Точнее, Foo :: Данные не доступны в приведенном вами фрагменте кода. Члены класса по умолчанию имеют закрытую видимость.

Во-вторых, когда вы используете C ++, typedef для объявлений структуры НЕ рекомендуется (есть другие допустимые применения, но вы не используете).

Попробуйте вместо этого исправленную версию:

class Foo {
public:
  struct Data {
    int field1;
    int field2;
  };
  ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...