gpt4 book ai didi

c++ - 别名成员对象方法的最佳方法? "Passthrough methods"

转载 作者:行者123 更新时间:2023-11-28 03:49:08 25 4
gpt4 key购买 nike

考虑以下代码:

class Rectangle
{
public:
// Constructors
Rectangle(){ init(0,0); }
Rectangle(int h, int w){ init(h,w); }

// Methods
void init(int h, int w)
{
_h = h;
_w = w;
}

// Getters / Setters
double get_h(void){ return _h; }
double get_w(void){ return _w; }
void set_h(double h){ _h = h; }
void set_w(double w){ _w = w; }
std::string get_name(void){ return _name; }
void set_name(std::string name){ _name = name; }

private:
// Private Members
int _h, _w;
std::string _name;
};

class House
{
public:
// <BEGIN PASSTHROUGHS>
std::string get_b_name(void){ return _base.get_name() };
std::string get_r_name(void){ return _roof.get_name() };
void set_b_name(std::string name){ _base.set_name(name); }
void set_r_name(std::string name){ _roof.set_name(name); }
// </END PASSTHROUGHS>

private:
// Private Members
Rectangle _base;
Triangle _roof;
};

这段代码工作正常。

我的问题涉及 House 类中的“直通”函数,由 PASSTHROUGHS 标记括起来。这是最好的方法吗?参数和返回类型将始终匹配,并且除了使事情更清晰和更直接之外,这些传递函数中没有任何“智能”。

我的直觉类似于以下之一:

get_b_name = _base.get_name;

// OR

std::string get_b_name(void) = _base.get_name;

...但不幸的是,两者似乎都不起作用,一开始只是一厢情愿。如果没有更简单的选择,告诉我也可以。谢谢!

最佳答案

我认为这个问题是概念性的。您的设计完全不面向对象,因为房屋不代表实体,而是在组件周围提供了一些胶水。从这个角度来看,为元素提供访问器比传递函数更有意义:

class House {
Rectangle _base;
Triangle _roof;
public:
const Rectangle& base() const {
return _base;
}
const Triangle& roof() const {
return _roof;
}
};

我想这只是一个玩具示例,但同样的推理适用:一个类应该代表一个实体,在该实体上执行一组操作,在某些情况下,这些操作可能根据内部子对象来实现,但它们仍然是对该类型的操作,如何收集它们是一个实现细节。

考虑:

class House {
Thermostat t;
public:
int temperature() const {
return t.temperature();
}
};

从用户的角度来看,房子有一个可以读取的温度,在这个特定的实现中,它是从作为成员的恒温器读取的。但这是一个实现细节。稍后您可能想在房子里安装更多的恒温器,并用读数的平均值代替单个读数,但这不会改变实体房屋(在此模型中)有温度的事实。

也就是说,您不应该考虑实现传递 功能,而应该考虑实现该类型的功能。如果实现恰好是对内部方法的单个转发,那很好。

但是如果类型包含内部成员并且访问成员的属性是有意义的,请考虑可能是您的实际类型应该只提供对其内部成员的访问。假设您想在屋内移动一架钢琴,那么您可能只提供对门成员的访问权限并让用户检查:

class House {
Door d;
public:
Door const & door() const {
return d;
}
};
bool can_enter_piano( House const & h, Piano const & p ) {
return h.door().width() > p.size();
}

无需提供House::get_door_width()House::get_door_color(),即可向 friend 描述入口,以及House::get_door_handle() 这样他们就可以知道他们什么时候到达...

关于c++ - 别名成员对象方法的最佳方法? "Passthrough methods",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6218651/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com