c++ - 命名空间或类中的实用程序函数?

标签 c++ qt namespaces

到目前为止,如果我需要一些常用的实用函数,我会将它们移到一个实用类中。以这样的方式:

#pragma once

class QDate;
class QDateEdit;
class QDialog;
class QWidget;

class GuiUtils final
{
public:
    static void moveDialog( QDialog* aDialog, const int aMargin = 4 );
    static void setMainWidget( QWidget* aParent, QWidget* aChild, const int aMargin = 0 );

    static void setValueBlocked( QDateEdit* aDateEdit, const QDate& aDate );

private:
    GuiUtils();
};

class DateUtils final
{
public:
    static QDate today();
    static QDate yesterday();
    static QDate firstDayOfWeek();
    static QDate firstDayOfMonth();
    static QDate firstDayOfQuarter();
    static QDate firstDayOfYear();

    static int quarter( const QDate& aDate );
    static int quarter( const int aMonth );

private:
    DateUtils();
};

但我知道还有其他选择。我可以将我所有的函数移动到命名空间中。以这样的方式:

#pragma once

class QDate;
class QDateEdit;
class QDialog;
class QWidget;

namespace gui_utils
{
    void moveDialog( QDialog* aDialog, const int aMargin = 4 );
    void setMainWidget( QWidget* aParent, QWidget* aChild, const int aMargin = 0 );

    void setValueBlocked( QDateEdit* aDateEdit, const QDate& aDate );
};

namespace date_utils
{
    QDate today();
    QDate yesterday();
    QDate firstDayOfWeek();
    QDate firstDayOfMonth();
    QDate firstDayOfQuarter();
    QDate firstDayOfYear();

    int quarter( const QDate& aDate );
    int quarter( const int aMonth );
};

对我来说,创建实用程序类似乎是比命名空间更好的解决方案。我看到我需要输入更多内容,但如果我需要为所有实用程序功能组定义一个新的命名空间,这对我来说看起来有点极端。我通常不会创建新的命名空间,而是每次都创建类,所以这就是我使用第一个选项的原因。

但现在我想知道:

  • 为此目的使用命名空间有什么好处吗?
  • 为此目的使用 namespace 是否有更好的性能?
  • 它是否更符合 C++ 的概念?
  • 为此使用命名空间还有其他原因吗?

我想知道您的意见,但我也需要解释。我不想重写我现有的代码并“仅仅因为”以不同的风格编写新代码。我需要一些基于语言/性能或任何其他类型的解释,说明为什么要以一种或另一种方式使用它。

感谢您的帮助。

最佳答案

我相信在您的情况下,出于各种原因,使用命名空间是更好的选择。

例如:

  1. 您的函数似乎不共享数据。
  2. 命名空间支持 ADL(参数相关名称查找)。

请参阅多种风格指南中的任何一种。这是来自 Google's 的剪辑:

*非成员、静态成员和全局函数 更喜欢将非成员函数放在命名空间中;... 不要只创建类来对不共享静态数据的静态成员函数进行分组,而是使用 namespace 。 *

关于c++ - 命名空间或类中的实用程序函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30694183/

相关文章:

C++。指针 vector 和使用 vector

xml - 如何在 Oracle 中对以下 XML 使用 XMLTable

javascript - 我如何命名 SystemJS 包

python - 3D *.STL 表面模型转换为 2D 图像堆栈?

C++ 结构指针指向对象类型错误

c++ - 友元函数和命名空间

c++ - QT通过C++添加Map QML Items

python - 使用 pyInstaller/UPX 制作的可执行文件遇到 QtCore4.dll 错误

c++ - 安装Qt报错 "The procedure entry point _ZdaPvj could not be located in the dynamic link library C:\Qt\4.8.6\bin\qmake.exe"

vb.net - 导入 : Should you, 不应该吗,语法和最佳实践