2012-04-27 40 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类型,例如,“名称”和“移动”到

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

,因此它可以被插入到地址簿中。但只限于已有的结构。

+1

问题是什么? – Pubby 2012-04-27 14:49:46

+1

这里没有问题。你在编辑? – 2012-04-27 14:50:02

+0

另外,没有“默认成员变量”这样的事情。 Perhas你的意思是默认构造的成员变量? – 2012-04-27 14:50:50

回答

2

当然有。这就是所谓的多重继承:

struct NameMobile : Name, Mobile {}; 

聚集NameMobile到一个新的类型NameMobile(包括其所有成员,递归)。由于您使用struct关键字声明它,所以暗示public修饰符(在NameMobile之前),因此可以省略。

+0

非常感谢!让我暂时考虑一下。如果这解决了我所有的问题,我会将其标记为正确。 :) – Steffen 2012-04-27 15:21:23

+0

请确保您阅读[此SO回答](http://stackoverflow.com/a/407928/921321)为避免MI的原因。然而,如果它满足你的要求并且没有任何问题,那就去做吧 – Lukazoid 2012-04-27 15:24:52

+0

@Lukazoid:是的,我知道说很容易被误用的东西,而且经常被误用是不好的。 **但是在任何情况下都不应该推广**(具有讽刺意味的是,这个陈述是泛泛的,并不会在我身上丢失)。 – bitmask 2012-04-27 15:29:31

1

是的。成分是我最常用的:

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

我在想些什么。但你如何转发成员?参考文献? – bitmask 2012-04-27 17:46:07

+0

你有选择性* *)具体来说,你有很多选择 - 选择最适合你的设计。这取决于很多事情。有些人会使用包装界面,提供访问器或提供直接访问。我会经常使用验证状态的私有访问器和封装器方法,因为我想在很多情况下只公开部分接口(或reword),或者提供额外的验证。对于访问者,你可以使用const限定的引用:'Name&name(){return this-> n_name; } \ n const Name&name()const {return this-> n_name; }' – justin 2012-04-27 18:14:14