2012-04-27 1 views
2

Пожалуйста, взять на себя управляющий класс ресурса, скажемОбъединить несколько базовых структур пользовательского типа

template<typename AddressFields> 
class AddressBook 
{ 
    std::list<AddressBookEntry<AddressFields> > book; 
}; 

который содержит список объектов AddressBookEntry. AddressBookEntry в основном предполагается, состоит из нескольких переменных членов по умолчанию плюс настраиваемых полей переменных, описанных в шаблонных AddressFields:

template<typename AddressFields> 
struct AddressBookEntry 
{ 
    int id; 
    AddressFields fields; 
}; 

я хотел бы дать несколько базовых структур, таких как

struct Name 
{ 
    std::string n_first; 
    std::string n_last; 
}; 

struct Address 
{ 
    std::string street; 
    int zip; 
    std::string city; 
}; 

struct Mobile 
{ 
    std::string m_number 
}; 

Теперь мой вопрос: есть ли способ создания новых структур на основе существующих структур? Я хочу, чтобы позволить пользователю создавать его/ее собственный тип AddressFields путем объединения, например, «Имя» и «Mobile» в

struct NameMobile 
{ 
    std::string n_first; 
    std::string n_last; 
    std::string m_number; 
}; 

поэтому он может быть подключен к AddressBook. Но только с уже существующими структурами.

+1

В чем вопрос? – Pubby

+1

Здесь нет никаких вопросов. Вы редактируете? –

+0

Кроме того, нет такой вещи, как «переменная элемента по умолчанию». Perhas вы имели в виду переменные-члены, которые по умолчанию построены? –

ответ

2

Существует, безусловно,. Это называется множественное наследование:

struct NameMobile : Name, Mobile {}; 

Это агрегатыName и Mobile в новый тип NameMobile (включая все их членов, рекурсивно). Поскольку вы объявляете его с помощью ключевого слова struct, модификаторы public (до Name и Mobile) подразумеваются и поэтому могут быть опущены.

+0

Спасибо большое! Позвольте мне подумать об этом на мгновение. Если это решает все мои проблемы, и я буду отмечать это как правильно. :) – Steffen

+0

Убедитесь, что вы прочитали [этот ответ SO] (http://stackoverflow.com/a/407928/921321) по причинам, чтобы избежать MI. Однако, если он делает то, что вам нужно, и проблем нет, тогда зайдите на него – Lukazoid

+0

@ Луказоид: Да, я знаю, что очень полезно говорить о вещах, которые можно легко использовать и часто неправильно использовать. ** Но ни при каких обстоятельствах не следует обобщать ** (ирония, что это утверждение является обобщением, не утрачивается на мне). – bitmask

1

Да. Наиболее часто используется состав:

struct NameMobile 
{ 
    ... 
private: 
    Name n_name; 
    Mobile n_mobile; 
}; 
+0

Я что-то думал по линиям. Но как вы пересылаете участников? Рекомендации? – bitmask

+0

вы заранее * выборочно *;) в частности, у вас есть много вариантов - выберите тот, который лучше всего подходит вашему дизайну. это зависит от многих вещей. некоторые люди будут использовать интерфейсы обертки, предоставлять аксессуры или предлагать прямой доступ. я часто использую частные аксессоры, которые проверяют состояние и методы оболочки, потому что во многих случаях я хочу выставить только часть интерфейса (или переименовать) или предоставить дополнительную проверку. для аксессуаров вы должны использовать ссылки с константой: 'Name & name() {return this-> n_name; } \ n const Имя и имя() const {return this-> n_name; } ' – justin

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