C++ 如何确保仅在c+;中提供时才使用特定的类功能+;?

C++ 如何确保仅在c+;中提供时才使用特定的类功能+;?,c++,c++11,software-design,C++,C++11,Software Design,假设我有一个使用另一个类作为特性的类 class city{ void travel(){ // if rail road travel by rail // if no rail road travel by foot } private: RailRoad rails; }; 当我实例化城市时 案例1:我可以拥有一个有铁路的城市 案例2:我也可以拥有一个没有铁路的城市 我认为应该使用railway*rails并使用nullptr

假设我有一个使用另一个类作为特性的类

class city{

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

        // if no rail road travel by foot 
    }

private:
   RailRoad rails;
};
当我实例化城市时

案例1:我可以拥有一个有铁路的城市

案例2:我也可以拥有一个没有铁路的城市

我认为应该使用
railway*rails
并使用
nullptr
作为标志来确定情况。我试图避免这样做,因为为此我必须进行新建和删除


有什么优雅的方法可以实现这一点吗?

boost::optional
(或
std::optional
,因为C++17)将提供相同的语义,而无需动态分配。

boost::optional
(或
std::optional
,因为C++17)将在没有动态分配的情况下为您提供相同的语义。

如果默认构建的
铁路
不太昂贵,您可以使用:

std::pair<bool, RailRoad> optionalRailroad;
表示对象是在没有
铁路的情况下创建的

optionalRailroad.first == true

表示对象是使用
铁路创建的如果默认构建的
铁路不太昂贵,可以使用:

std::pair<bool, RailRoad> optionalRailroad;
表示对象是在没有
铁路的情况下创建的

optionalRailroad.first == true


暗示该对象是使用
铁路创建的

如果我仅限于c++11,还有其他方法吗?我还想用boost来实现我的目标。@rokche
boost::optional
对不起,我忘了说我现在也不允许使用boost:/@pocke:为什么不可以?@pocke:什么样的法律原因?Boost许可证是非常允许的。如果我被限制在c++11上,还有其他的选择吗?我还想用boost来实现我的目标。@rokche
boost::optional
对不起,我忘了说我现在也不允许使用boost:/@pocke:为什么不可以?@pocke:什么样的法律原因?Boost许可证是非常允许的。如果你不想手动执行
new
delete
,你可以使用智能点,比如
std::unique_ptr
@songyuanyao:这仍然是动态分配,你不需要也不想要。@boundaryPosition这取决于OP的意图;或者你的意思是我们应该总是使用
std::optional
而不是智能指针?@songyuanyao:不“总是”,但在合适的时候,比如现在如果你不想手动执行
new
delete
,你可以使用智能指针,像
std::unique_ptr
@songyuanyao:这仍然是动态分配,你既不需要也不想要。@boundaryPosition,这取决于OP的意图;或者你的意思是我们应该总是使用
std::optional
而不是智能指针?@songyuanyao:不“总是”,但在合适的时候,比如现在我喜欢你的想法,但你认为这比按照songyuanyao的建议使用std::unique\ptr更好吗?@pocke,我发现很难评估这两种方法的优缺点,因为我不知道你希望如何使用这门课。理想情况下,不应公开成员变量。提供可以使用我的建议或智能指针实现的函数。如果其中一个似乎有问题,您可以将成员变量切换到另一个。指针加动态分配比bool有更多的开销。您可以用一个可选的like模板包装这对代码。@RSahu为什么说
。理想情况下,不应公开成员变量
。我计划制作std::pair OptionalRailway;`私有。@Pocke,这就是我的意思。我喜欢你的想法,但你认为它比宋元耀建议的使用std::unique\u ptr更好吗?@Pocke,我发现很难评估这两种方法的利弊,因为我不知道你希望如何使用这个类。理想情况下,不应公开成员变量。提供可以使用我的建议或智能指针实现的函数。如果其中一个似乎有问题,您可以将成员变量切换到另一个。指针加动态分配比bool有更多的开销。您可以用一个可选的like模板包装这对代码。@RSahu为什么说
。理想情况下,不应公开成员变量
。我计划制作std::pair OptionalRailway;`“二等兵!”波奇,我就是这个意思。