9

在以下情况下您可以使用哪些方法:

  • 您与几个(例如 1-3 个)其他程序员一起在一个小型 C++ 项目上工作,您使用单个存储库
  • 你创建一个类,声明它的方法
  • 你还没有时间实现所有方法
  • 你不希望其他程序员使用你的代码(因为它还没有实现);或者不想使用尚未实现的代码部分
  • 你没有时间/没有机会向你的同事讲述所有这些尚未实施的东西
  • 当您的同事使用您尚未实现的代码时,您希望他们立即意识到他们不应该使用它 - 如果他们遇到错误,您不希望他们想知道哪里出了问题,搜索潜在的错误等。
4

7 回答 7

14

最简单的答案是告诉他们。与一群人一起工作时,沟通是关键。

一个更强大(并且可能是最好的)的选择是创建自己的分支来开发新功能,并且仅在完成后将其合并回来。

但是,如果您确实希望在主源代码树中实现您的方法,但不希望人们使用它们,请使用异常或断言将它们存根。

于 2010-07-22T23:29:39.920 回答
10

我实际上喜欢 .Net 的概念NotImplementedException。您可以轻松地将您自己的、派生自std::exception、覆盖的定义what为“未实现”。

它具有以下优点:

  1. 易于搜索。
  2. 允许编译当前和依赖的代码
  3. 可以执行到需要代码的点,在这一点上,你失败了(你立即有一个执行路径来证明需要)。
  4. 当它失败时,它不会进入一个已知状态,只要你不完全吞下异常,而不是依赖于不确定的状态。
于 2010-07-23T00:09:31.850 回答
8

你应该,只是不提交代码,或者更好的是,将它提交到开发分支,这样至少在你的机器发生灾难性故障的情况下它会离开你的机器。

这就是我在使用我的 git 存储库时所做的。我在一天结束时将我的工作推送到远程仓库(而不是主分支)。我的同事知道这些树枝非常不稳定,除非他真的很喜欢折断树枝,否则不要用十英尺长的杆子碰它。

Git 对于这种情况非常方便,我想,其他具有廉价分支的 dvcs 也是如此。在 SVN 或更糟糕的情况下在 CVS 中执行此操作将意味着痛苦和痛苦。

于 2010-07-22T23:34:14.400 回答
7

我不会将其检入存储库。

于 2010-07-22T23:28:02.407 回答
5

宣布它。不要实施它。当程序员使用调用未实现部分的代码链接器抱怨时,这对程序员来说是明显的打击。

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;
}
于 2011-11-21T12:44:48.097 回答
4

断言是最好的方法。断言不终止程序会更好,这样同事就可以继续测试他的代码而不会被您的函数存根阻塞,并且他可以完全了解尚未实现的内容。

如果您的 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.
    }

优点:

  1. 代码编译并运行
  2. 当且仅当开发人员在测试期间遇到您的代码时,他才会收到有关未实现的消息,因此他不会被不必要的信息淹没
  3. 该消息指向相关代码(而不是异常捕获块或其他)。调用堆栈是可用的,因此可以追溯到他调用未完成的代码的地方。
  4. 开发人员收到消息后可以继续他的测试运行,而无需重新启动程序

缺点:

  1. 要禁用一条消息,必须注释掉一行代码。这样的更改可能会潜入提交。

初始 DEBUG_ASSERT 实施的 PS Credits 转到我的同事 EG

于 2010-07-23T09:32:33.867 回答
0

您可以对继承的类使用纯虚函数 (= 0;),或者更常见的是,声明它们但不定义它们。您不能调用没有定义的函数。

于 2010-07-22T23:27:13.433 回答