2

我在 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) 
    {
        //...
    }
}

用静态方法定义经典类会更好吗?
还是只是简单的课?
这种方法对编译器链接器有更好的作用吗?

此命名空间中的方法被称为 allot of times 。

4

6 回答 6

5

在性能方面,staticnamespace. 虽然这是一个逻辑问题。您的功能是否与课程相关?

一个很好的问题要问自己——你是为了更好的组织而在类中创建static成员函数(或者只是为了将它们组合在一起)?如果答案是肯定的,您可能应该使用namespace.

于 2012-06-11T13:51:28.453 回答
5

巧合的是,我碰巧在 Stack Overflow 中阅读了这个答案,以解决稍微不同的问题。用户 rhalbersma 提供了一个很好的链接,指向Dobb 博士的一篇文章,作者 Scott Meyers 解释了如何在类外实现方法(非友元方法),但在同一个命名空间内实际上改进了封装。对我来说,今天是一个很好的学习。希望这对您也有帮助。

于 2012-06-11T14:02:44.693 回答
4

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

于 2012-06-11T13:54:08.607 回答
1

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

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

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

于 2012-06-11T13:58:13.850 回答
0

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

因此,如果您随后可以在与该类自然相关的适当命名空间中在该类之外实现它。

编辑:看来 OP 确实在询问是否实现命名空间或静态类作为实用程序/相关功能的持有者对象。在我看来,命名空间是做到这一点的正确方法,因为这就是它们的用途。不需要上课。

于 2012-06-11T14:03:05.613 回答
0

没有绝对的规则,但一般来说,除非函数表现出很大程度的连贯性,并且由于某种原因你想关闭“命名空间”,所以客户端不能向其中添加函数,使用namespace 通常比使用更可取class。当然,除非目的是使它们可用于模板:您可以在类上实例化模板,但不能在命名空间上实例化。(这种技术通常称为“特征”;没有非静态成员的类称为特征类。)

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

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

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

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

于 2012-06-11T14:31:28.740 回答