在以下情况下您可以使用哪些方法:
- 您与几个(例如 1-3 个)其他程序员一起在一个小型 C++ 项目上工作,您使用单个存储库
- 你创建一个类,声明它的方法
- 你还没有时间实现所有方法
- 你不希望其他程序员使用你的代码(因为它还没有实现);或者不想使用尚未实现的代码部分
- 你没有时间/没有机会向你的同事讲述所有这些尚未实施的东西
- 当您的同事使用您尚未实现的代码时,您希望他们立即意识到他们不应该使用它 - 如果他们遇到错误,您不希望他们想知道哪里出了问题,搜索潜在的错误等。
在以下情况下您可以使用哪些方法:
最简单的答案是告诉他们。与一群人一起工作时,沟通是关键。
一个更强大(并且可能是最好的)的选择是创建自己的分支来开发新功能,并且仅在完成后将其合并回来。
但是,如果您确实希望在主源代码树中实现您的方法,但不希望人们使用它们,请使用异常或断言将它们存根。
我实际上喜欢 .Net 的概念NotImplementedException
。您可以轻松地将您自己的、派生自std::exception
、覆盖的定义what
为“未实现”。
它具有以下优点:
你应该,只是不提交代码,或者更好的是,将它提交到开发分支,这样至少在你的机器发生灾难性故障的情况下它会离开你的机器。
这就是我在使用我的 git 存储库时所做的。我在一天结束时将我的工作推送到远程仓库(而不是主分支)。我的同事知道这些树枝非常不稳定,除非他真的很喜欢折断树枝,否则不要用十英尺长的杆子碰它。
Git 对于这种情况非常方便,我想,其他具有廉价分支的 dvcs 也是如此。在 SVN 或更糟糕的情况下在 CVS 中执行此操作将意味着痛苦和痛苦。
我不会将其检入存储库。
宣布它。不要实施它。当程序员使用调用未实现部分的代码链接器抱怨时,这对程序员来说是明显的打击。
class myClass
{
int i;
public:
void print(); //NOt yet implemented
void display()
{
cout<<"I am implemented"<<endl;
}
};
int main()
{
myClass var;
var.display();
var.print(); // **This line gives the linking error and hints user at early stage.**
return 0;
}
断言是最好的方法。断言不终止程序会更好,这样同事就可以继续测试他的代码而不会被您的函数存根阻塞,并且他可以完全了解尚未实现的内容。
如果您的 IDE 不支持智能断言或持久断点,这里是简单的实现 (c++):
#ifdef _DEBUG
// 0xCC - int 3 - breakpoint
// 0x90 - nop?
#define DebugInt3 __emit__(0x90CC)
#define DEBUG_ASSERT(expr) ((expr)? ((void)0): (DebugInt3) )
#else
#define DebugInt3
#define DEBUG_ASSERT(expr) assert(expr)
#endif
//usage
void doStuff()
{
//here the debugger will stop if the function is called
//and your coworker will read your message
DEBUG_ASSERT(0); //TODO: will be implemented on the next week;
//postcondition number 2 of the doStuff is not satisfied;
//proceed with care /Johny J.
}
优点:
缺点:
初始 DEBUG_ASSERT 实施的 PS Credits 转到我的同事 EG
您可以对继承的类使用纯虚函数 (= 0;),或者更常见的是,声明它们但不定义它们。您不能调用没有定义的函数。