相关疑难解决方法(0)

有效的C++项目23首选非成员非友元函数到成员函数

虽然对类设计中的一些事实感到困惑,特别是函数是否应该是成员,但我查看了有效的c ++并找到了第23项,即将非成员非友元函数更喜欢成员函数.第一手阅读Web浏览器示例有一定意义,但是该示例中的便捷函数(在本书中命名为非成员函数)会改变类的状态,不是吗?

  • 所以,第一个问题,他们不应该成为会员吗?

  • 进一步阅读,他认为STL函数,实际上某些类没有实现的函数是在stl中实现的.继他们演变成被包装到一些合理的命名空间,如一些便利功能,这本书的想法std::sort,std::copyalgorithm.例如,vector类没有sort函数,并且使用stl sort函数,因此它不是向量类的成员.但是也可以将相同的推理延伸到向量类中的某些其他函数,例如,assign这样也不能作为成员实现,而是作为便利函数实现.但是,这也会改变对象的内部状态,例如它操作的排序.那么这个微妙但重要(我猜)问题背后的理由是什么呢?

如果你有权访问这本书,你可以为我澄清这些要点吗?

c++ encapsulation member-functions effective-c++ non-member-functions

35
推荐指数
4
解决办法
1万
查看次数

函数何时应该是成员函数?

我公司里有一位同事,他的意见我非常尊重,但我根本无法理解他在C++中编写代码的首选方式.

例如,鉴于有一些A类,他将编写该类型的全局函数:

void foo( A *ptrToA ){}
Run Code Online (Sandbox Code Playgroud)

要么:

void bar( const A &refToA ){}
Run Code Online (Sandbox Code Playgroud)

在看到这样的全球函数时,我的第一直觉是:"为什么不是A的这些成员?" 他会坚持认为这与C++中的良好实践建议是一致的,因为foo和bar可以通过使用A的公共接口执行他们需要执行的所有操作.例如,他会认为这是完全一致的与Scott Meyers有效的C++推荐.我发现很难将这与第19章中的第19项相协调,它基本上说一切都应该是一个成员函数,但有一些例外(operator <<和operator >>以及需要动态类型转换的函数).此外,虽然我同意的功能可以做他们需要一个公共接口做什么,在我看来,这主要是人写有getter和setter类因此与A级的每一个数据成员的结果公共接口,A是一个过度美化的结构,你当然可以使用公共接口做任何事情.就个人而言,我认为不应该被剥削,我认为应该气馁.

显然,这只能用于像C++这样不是纯面向对象的语言,所以我想一种看待它的方法是我的同事不喜欢纯粹的面向对象的软件设计方法.有没有人知道任何支持这种立场的文献作为最佳实践?或者是否有人同意这一点,并且可能以与我的同事不同的方式向我解释,以便我可以看到光明?或者每个人都同意我目前的感觉,这只是没有多大意义?

编辑: 让我给出一个更好的代码示例.

class Car
{
    Wheel frontLeft;
    Wheel frontRight;
    Wheel rearLeft;
    Wheel rearRight;
    Wheel spareInTrunk;

public:
    void wheelsOnCar( list< Wheel > &wheels )
    {
        wheels.push_back( frontLeft );
        wheels.push_back( frontRight);
        wheels.push_back( rearLeft);
        wheels.push_back( rearRight);
    }
    const Wheel & getSpare(){ return spareInTrunk; }
    void setSpare( const Wheel &newSpare ){ spareInTrunk = newSpare; }
    // There are getters and setters for the other …
Run Code Online (Sandbox Code Playgroud)

c++

25
推荐指数
5
解决办法
2861
查看次数

静态函数导致更多静态函数

我有一个类,它有一些自己有用的函数,它们是静态的.现在这些函数依赖于其他自身无用的函数(但不与类成员变量交互),但也是静态的,因此它们是私有的.现在我有一个包含许多非静态函数的类,以及一些静态公共函数和一些静态私有函数.

这是好习惯吗?(我应该将其作为社区维基吗?)

c++

6
推荐指数
1
解决办法
198
查看次数