C++ 在C+中记录接口的位置+;?

C++ 在C+中记录接口的位置+;?,c++,interface,C++,Interface,我有更多的Java背景,因此让我用一个Java示例来说明。假设存在以下代码: interface iFoo { /* Do foo */ void foo(); /* Do bar */ void bar(); } class A implements iFoo { void foo() {}; void bar() {}; } class B<iFoo> { iFoo foo; B() { foo.

我有更多的Java背景,因此让我用一个Java示例来说明。假设存在以下代码:

interface iFoo {
    /* Do foo */
    void foo();
    /* Do bar */
    void bar();
}

class A implements iFoo {
    void foo() {};
    void bar() {};
}

class B<iFoo> {
    iFoo foo;
    B() {
        foo.foo();
        foo.bar(); 
    } 
} 

//somewhere in the code:
B b = new B<A>();
接口iFoo{
/*多福*/
void foo();
/*酒吧*/
空心钢筋();
}
类实现iFoo{
void foo(){};
void bar(){};
}
B类{
伊福福;
B(){
foo.foo();
foo.bar();
} 
} 
//代码中的某个地方:
B=新的B();
现在,如果我想实现一个可以用作B的类型参数的类C,我知道C必须实现iFoo。因此,我按照合同约定进行设计,所有必要的文档都将在那里(我需要实现哪些方法,签名加内联文档是什么)

在C++中,它看起来是这样的(如果我错了,请纠正我):

A类{
公众:
void foo();
空心钢筋();
}
样板
B类{
公众:
T foo;
B(){
foo.foo();
foo.bar();
} 
} 
//代码中的某个地方:
B*B=新的B();

什么地方是B所期望的C++的最好的地方?或者,如果我有一个A和B,并且想要实现一个被作为类型参数传递给B的C类,那么我如何找出T的B的期望值呢?当然,这是一个非常简单的例子,只是想象更大更复杂的类。ss看起来像这样:

struct IFoo
{
    virtual void foo() = 0;
    virtual void bar() = 0;

    virtual ~IFoo() {}
};
然后像普通类一样继承它

class A : public IFoo
{
public:
    void foo();
    void bar();
};

在C++中,纯抽象接口类看起来是这样的:

struct IFoo
{
    virtual void foo() = 0;
    virtual void bar() = 0;

    virtual ~IFoo() {}
};
然后像普通类一样继承它

class A : public IFoo
{
public:
    void foo();
    void bar();
};

可以使用C++方法实现与C++中的接口相同的事情,在方法定义的末尾放“代码>= 0 < /代码>,并且您拥有什么是有效的接口。(实际上它是一个基类,它必须从它本身被实例化而来,并且在C++术语中被称为‘’。”


但这给了你答案,没有什么能阻止你说A是基本接口,并用它作为“B期望T”的定义。所以如果A有两个方法,foo()和bar()这就是它所提供的,这也是从一个意志中派生出来的所有类。

你可以用虚拟方法做与C++中的接口相同的事情,在方法定义的结尾放置<代码>=0 < />,并且你拥有什么是一个有效的接口。(实际上它是一个基类,它必须从它本身被实例化而来,并且在C++术语中被称为‘’。”
但这给了你答案,没有什么能阻止你说A是基本接口,并用它作为“B期望T”的定义。所以如果A有两个方法,foo()和bar(),这就是它所提供的,这也是所有从A派生的类都将拥有的。

我想说,文档的一个好地方是定义类的头文件。您的库的用户将查看头文件以查看接口,她应该在那里找到整个类或模板的文档公众成员的nd

类或模板作为一个整体以及每个公共成员都应该有详细说明目的、假设、先决条件等的文档

例如:

foo.h:

// The "Foo" template implements a gizmo according to Smith, Jones et al.
// A Foo<T> can be used as a drop-in replacement for the usual Zip<T>.
//
// The template parameter T must be a complete object type which is
// assignable and copyable.
template <typename T>
class Foo
{
public:
    // Reflect the template parameters
    using type = T;
    using refence = T &;

    // Constructs a Foo with a given state of being active, a given age
    // and an identifier that represents its glurgh.
    Foo(bool active, int age, char id);

    // Perform the magic act of foo.
    // It is safe to call this function multiple times concurrently.
    // Returns the number of bars.
    //
    // Intended usage:
    //
    //    Foo x(false, 10, 'a');
    //    registerGlobally(x);
    //    x.activate();
    //    return x.perform();
    //
    int perform();

private:
    // ...
};
//根据Smith、Jones等人的说法,“Foo”模板实现了一个gizmo。
//Foo可以作为普通拉链的替代品。
//
//模板参数T必须是完整的对象类型
//可转让和可复制。
样板
福班
{
公众:
//反映模板参数
使用类型=T;
使用refence=T&;
//构造具有给定活动状态和给定年龄的Foo
//以及表示其glurgh的标识符。
Foo(bool-active,int-age,char-id);
//表演富的魔术表演。
//同时多次调用此函数是安全的。
//返回条数。
//
//预期用途:
//
//Foo x(假,10,'a');
//全球注册(x);
//x.激活();
//返回x.perform();
//
int perform();
私人:
// ...
};
理想情况下,在没有其他参考、手册或教程的情况下,用户应该能够通过查看标题来了解如何使用该类。如果您严格遵守规则并同时维护适当的参考手册,那么您可能不需要示例,但需要必要的信息(参数的含义和要求,返回值的含义)应存在

当您从抽象基类公开继承时,这当然意味着基类已经包含了所有接口文档,您不需要重复一般信息。但是,您仍然应该留下一个简短的注释,其中包含具体重写,说明它们具体对您的实现做了什么



如果您希望模板参数满足某些约束,如从某个基类派生,则可以通过使用类型特征、SFINAE和模板元编程以编程方式强制执行该约束。您仍应以可读的形式记录模板参数的要求,但强制执行此类约束是一种很好的卫生方法ts在代码中。

我想说,文档的一个好地方是定义类的头文件。您的库的用户将查看头文件以查看接口,她应该在那里找到整个类或模板以及公共成员的文档

类或模板作为一个整体以及每个公共成员都应该有详细说明目的、假设、先决条件等的文档

例如:

foo.h:

// The "Foo" template implements a gizmo according to Smith, Jones et al.
// A Foo<T> can be used as a drop-in replacement for the usual Zip<T>.
//
// The template parameter T must be a complete object type which is
// assignable and copyable.
template <typename T>
class Foo
{
public:
    // Reflect the template parameters
    using type = T;
    using refence = T &;

    // Constructs a Foo with a given state of being active, a given age
    // and an identifier that represents its glurgh.
    Foo(bool active, int age, char id);

    // Perform the magic act of foo.
    // It is safe to call this function multiple times concurrently.
    // Returns the number of bars.
    //
    // Intended usage:
    //
    //    Foo x(false, 10, 'a');
    //    registerGlobally(x);
    //    x.activate();
    //    return x.perform();
    //
    int perform();

private:
    // ...
};
//根据Smith、Jones等人的说法,“Foo”模板实现了一个gizmo。
//Foo可以作为普通拉链的替代品。
//
//模板参数T必须是完整的对象类型
//可转让和可复制。
临时雇员