2011-06-01 43 views
4

有时候,像写一行到控制台的某些事情,感觉喜欢的事,应该是对所有对象全局访问。例如:静态函数是否可以接受C++中某些事情的实践?

writeError("UNHANDLED EXCEPTION",someData); 

此外,像数学函数这样的东西也有这种感觉。但是当你做这种事情变得糟糕时,你怎么画线?

+4

来自Java或C#,呃? – 2011-06-01 13:22:17

+0

静态函数不是全局可访问的。他们是翻译单位的当地人。 – 2011-06-01 13:23:11

+0

@Tadeusz:这取决于你的意思是“静态”。 – 2011-06-01 13:34:40

回答

10

有些人在非成员函数需要成为它的一个参数friend的地方画线,所以他们使用了很多免费函数。

有些人在画点,其中非成员函数可以合理是它的一个参数的成员函数,即使它实际上并没有使用类的内部线路。他们的免费功能较少。

它通常最好不要认为这是“成为坏习惯” - 不是在C++所有的设计是“正确的”面向对象的。如果你的任务最好通过OOP以外的方式解决,那么使用OOP本身就是“不好的做法”。关于如何最好地设计你的代码的论点可以无限期地用任何语言继续下去,但是C++并没有做出任何特别的努力来指导你编写类。

参见:

Effective C++ Item 23 Prefer non-member non-friend functions to member functions

+1

为了说明OOP问题:类方法依赖于(隐式地)在类内部。但是,免费函数只能访问类公共API。这减少了耦合/增强封装:因此更容易改变类内部,声明类不变量等等。 – 2011-06-01 14:08:05

6

全球这种性质的API是就好了。

这些天是包装他们在一个命名空间中的最佳实践:

namespace LOGGING { 
    void writeError(message, ...); 
} 

制作的东西在C++中的静态是不一样的事情使一些在Java静态。在C++中,静态函数只能从该编译单元(.cpp文件)中看到。它并没有使它成为一个全球性的非类功能。然而,C++中的静态成员函数在Java中是相同的 - 它允许从对象上下文class :: method(params)之外调用它,而不是classObject.method(params)。

1

这里有两个问题:

是静态函数接受 做法在C某些事情++?

是的,有些东西只能使用功能存档。例如,注册到大量回调。

还有诸如数学函数 这样的东西也有这种感觉。但是如何做 做这样的事情 成为不好的做法呢?

此外,在班运营商可以是函数(例如运营商+,取两个操作数,或流运算符。 如何画一条线?我猜做的不够的坏事,以确定什么是坏,什么是不错。取得经验足够的经验,你就会知道。 我的建议是尽量充分单元测试你的代码。有长期和复杂的单元测试,还是没能容易单元测试的东西通常是一个问题的征兆。

+0

+1趣味点 - 单元测试作为良好设计的标准 – davka 2011-06-01 14:32:58

相关问题