Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在C+中创建接口的对象+;_C++_Object Oriented Analysis - Fatal编程技术网

C++ 在C+中创建接口的对象+;

C++ 在C+中创建接口的对象+;,c++,object-oriented-analysis,C++,Object Oriented Analysis,我知道这个问题有点奇怪,但请容忍我 我正在为一个停车场设计一个OOD。我只允许那些具有自动停车功能的车辆停车。在Java中,我会创建一个接口,并且只允许该接口的对象(即具有自动停车功能的汽车)停车。在C++中,接口使用纯虚拟方法使用抽象类来创建。因此,我无法创建此“C++接口”的对象。那么,如何在C++中实现这一点?p> 注意:我知道其他技术,比如使用一些标志来表示是否存在autopark功能等;但我对这些变通办法不感兴趣 您正在寻找一种创建匿名具体类的方法 在C++中,可以通过将结构/类作为变

我知道这个问题有点奇怪,但请容忍我

我正在为一个停车场设计一个OOD。我只允许那些具有
自动停车功能的车辆停车。在Java中,我会创建一个接口,并且只允许该接口的对象(即具有
自动停车
功能的汽车)停车。在C++中,接口使用纯虚拟方法使用抽象类来创建。因此,我无法创建此“C++接口”的对象。那么,如何在C++中实现这一点?p>
注意:我知道其他技术,比如使用一些标志来表示是否存在
autopark
功能等;但我对这些变通办法不感兴趣

您正在寻找一种创建匿名具体类的方法

在C++中,可以通过将结构/类作为变量声明的“类型”来创建匿名结构。下面是实现类(请注意,它是匿名的,但仍然扩展了
Foo
,我们的纯虚拟/'abstract'基类),我们没有以分号结尾,而是给它一个变量名,以便立即在堆栈上分配该匿名类的实例

<>因此,这就是为什么C和C++中的类、结构和枚举必须以分号结尾(而像<代码>命名空间< /代码>不一样)。
#包括
使用名称空间std;
福班{
公众:
虚拟空心条()=0;
};
无效调用栏(Foo*Foo){
foo->bar();
}
int main(){
类别:公共食品{
虚拟空心条(){

CUT也不能在java中创建接口类型的对象。这里没有区别。@克里斯,使用匿名类?类似于?创建一个实现接口的具体匿名类对象。删除java问题标签。您可能在讨论您的java,但它全部是关于C++的。@ HovercraftFullOfEels、 对不起,谢谢你把标签去掉。
#include <iostream>

using namespace std;

class Foo {
public:
    virtual void bar() = 0;
};

void callBar(Foo *foo) {
    foo->bar();
}

int main() {
    class : public Foo {
        virtual void bar() {
            cout << "Hello from foo1" << endl;
        }
    } foo1; // <-- Note that we immediately create foo1 here...

    class : public Foo {
        virtual void bar() {
            cout << "Bonjour from foo2" << endl;
        }
    } foo2; // <-- ... and foo2 here.

    callBar(&foo1);
    callBar(&foo2);

    return 0;
};