2010-03-28 5 views
3

У меня есть что-то вроде:Как переместить структуру в класс?

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 без создания новый класс? Данные отражают структуру, существующую в библиотеке, которую я использую в другом месте. (т. е. те же поля, просто другое имя.Я передал данные в другую структуру позже.Я делаю это, потому что Foo является абстрактным классом, а производный класс с использованием библиотеки является лишь одним из многих.)

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

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

я 'Data' in class 'Foo' does not name a type в Bar data_;

+0

Итак, вы хотите создать класс, который похож на Data_s? Или вы хотите скопировать значения своих членов во время выполнения в класс? – Cam

+1

Есть только несколько различий между структурой и классом, чего вы пытаетесь достичь, «переместив структуру в класс»? Возможно, некоторые разъяснения о том, что именно вы пытаетесь сделать, помогут. – stefanB

+0

Добавлено/уточнено. Это лучше? – Kache

ответ

4

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

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); 
} 

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

+1

Поскольку вопрос имеет структуру Data_s и класс Foo, можете ли вы пересмотреть свой ответ в терминах этих? –

2

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

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

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

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

просто любопытно, когда typedef для деклараций структуры рекомендуется? – Kache

+0

Никогда в C++. В C, если вы не использовали typedef, вам нужно было бы сказать «struct that» всюду, typedef позволяет вам говорить только «это». С C++ вам не нужна структура, поэтому typedef бесполезен. Typedef имеет другие применения, особенно при наличии шаблонов, но typedef в определении класса или структуры - это быстрый способ определить программиста на C с нулевым опытом C++. –

+0

На самом деле, я делал это только b/c. Я следовал примеру библиотек minizip и unrar, которые написаны на C. @. @ – Kache

Смежные вопросы