C++ 在C+中记录接口的位置+;?
我有更多的Java背景,因此让我用一个Java示例来说明。假设存在以下代码: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.
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必须是完整的对象类型
//可转让和可复制。
临时雇员