c ++何时将方法放在类之外

时间:2012-06-11 13:48:57

标签: c++ namespaces

我在c ++应用程序中看到过一次只使用带有头文件和源文件的命名空间声明,如下所示:

#ifndef _UT_
#define _UT_

#include <string>
#include <windows.h>

namespace UT 
{
    void setRootPath(char* program_path, char* file_path);
    char * ConvertStringToCharP(std::string str);
};

#endif

//and then in UT.cpp
#include "UT.h"

namespace UT 
{
    char * ConvertStringToCharP(std::string str)
    {
        char * writable = new char[str.size() + 1];
        std::copy(str.begin(), str.end(), writable);
        writable[str.size()] = '\0';  
        return writable;
    }

    void setRootPath(char* program_path, char* file_path) 
    {
        //...
    }
}

比使用静态方法定义经典类更好吗? 或者只是简单的课程?
剂量这种方法对编译器链接器有什么好处?

此命名空间中的方法被称为分配。

6 个答案:

答案 0 :(得分:5)

在性能方面,在static中拥有namespace类成员和自由函数之间没有区别。这是一个逻辑问题。你的职能是否与班级有关?

一个很好的问题要问自己 - 你是否为了更好的组织而在课堂上创建static成员函数(或者只是为了将它们组合在一起)?如果答案是是的,您应该使用namespace

答案 1 :(得分:5)

通过剪切巧合,我碰巧在Stack Overflow中阅读this answer略有不同的问题。用户rhalbersma给了Dr Dobb's article一个很好的链接,其中作者Scott Meyers解释了如何在类之外实现方法(非朋友方法),但在同一名称空间内实际改进封装。对我来说,今天这是一个很好的学习。希望这对你也有帮助。

答案 2 :(得分:4)

当方法的含义独立于类时,您将方法放在所有类之外。其他语言中的静态类(Java,C#)是一种补偿无法将方法放在类外的方法。由于C ++通过名称空间提供了这种开箱即用的功能,因此使用额外的“静态类”对于代码的读者来说是违反直觉的。

答案 3 :(得分:1)

使用静态class成员函数的主要原因是与类及其成员的逻辑和概念关系。

另一个原因可能是启用模板部分特化,这对于函数模板是允许的,但对于类来说是不允许的。

否则,请使用独立函数(在适当的namespace中定义)。

答案 4 :(得分:0)

默认情况下,您应该始终尝试最小化类的方法。如果您可以在类方面实现功能,而不是在应该在类中实现。换句话说,如果您可以通过使用已发布的公共接口来实现所需的功能,那么您应该这样做。这极大地降低了代码对实现细节的依赖性。

因此,如果你可以在一个适当的命名空间中在类之外实现它,这个命名空间似乎与该类有关。

编辑:OP似乎真的在询问是否实现名称空间或静态类作为实用程序/相关函数的持有者对象。在我看来,命名空间是正确的方法,因为这是他们的目的。没必要上课。

答案 5 :(得分:0)

没有绝对的规则,但总的来说,除非功能显示 很大程度的连贯性,你想要关闭“命名空间” 由于某种原因,客户端无法使用namespace向其添加功能 通常优于使用class。当然,除非意图 是使它们可用于模板:您可以实例化模板 在类上,但不在命名空间上。 (这种技术通常被称为 “特质”;没有非静态成员的类称为traits类。)

即使您使用名称空间,也应该定义函数:

void UT::setRootPath( char const* programPath, char const* filePath)
{
    //  ...
}

char* UT::convertStringToCharP( std::string const& str )
{
    //  ...
}

这样,函数签名中的任何拼写错误都将被检测到 编译器。