2017-04-21 74 views
0

可以说我有班级,使用另一个班作为功能。如何确保仅在C++中提供特定的类功能?

class city{ 

    void travel(){ 
     // if rail road travel by rail 

     // if no rail road travel by foot 
    } 

private: 
    RailRoad rails; 
}; 

当我实例化城市

的情况下1:我可以有城市铁路。案例2:我也可以有没有铁路的城市。

我以为是使用RailRoad * rails并使用nullptr作为标志来确定案件。我试图避免这一点,因为为此我必须做新的和删除。

是否有任何优雅的方式来实现这一目标?

+0

创建如果你不想手动执行'new'和'delete',你可以使用智能点,比如'std :: unique_ptr'。 – songyuanyao

+0

@songyuanyao:你不需要也不需要动态分配。 –

+0

@BoundaryImposition它取决于OP的意图;或者你的意思是我们应该总是使用'std :: optional'而不是智能指针? – songyuanyao

回答

2

如果默认构造RailRoad是不是太贵,你可以使用:

std::pair<bool, RailRoad> optionalRailroad; 

为成员变量与

optionalRailroad.first == false 

意味着对象没有RailRoad

创建的理解
optionalRailroad.first == true 

意味着对象t用RailRoad

+0

我喜欢你的想法,但你认为它更好,然后使用std :: unique_ptr像宋玉瑶建议的那样? – pokche

+1

@pokche,我发现很难评估这两种方法的优点和缺点,因为我不知道你希望如何使用这个类。理想情况下,你不应该暴露成员变量。提供可以使用我的建议或智能指针实现的功能。如果看起来有问题,可以将成员变量切换到另一个。 –

+1

指针加动态分配的开销比bool多。你可以将这一对包装在一个可选的模板中。 –

2

boost::optional<RailRoad>(或自C++ 17以来的std::optional<RailRoad>)将给你没有动态分配的相同语义。

+0

如果我只限于c + + 11有没有替代这个?我也想用'bool'来实现我的目标。 – pokche

+0

@rokche'boost ::可选' –

+0

对不起,我忘了提及我现在也不允许使用boost:/ – pokche

相关问题