在C++中,我如何声明一个接口,我可以使用它,如下所示:
/** Enemy "Interface" */
Class Enemy {
Enemy();
virtual ~Enemy();
virtual void doStuff() = 0;
};
/** Enemy of type 1 */
Class Enemy_type1 : public Enemy {
Enemy_type1();
virtual ~Enemy_type1();
virtual void doStuff() {
// different for every type of enemy
}
};
/** Add an enemy to EnemyManager */
void EnemyManager::addEnemy(Enemy * e) {
this->enemies.push_back(*e); // declared as vector<Enemy> enemies;
}
Run Code Online (Sandbox Code Playgroud) C++ 中的接口被实现为抽象类,即纯虚方法。同样,C++中的抽象类也是同样的实现方式。我可以说接口和抽象在 C++ 中是相同的,除了接口可能是动词的概念 - 行为和抽象类是名词。我的理解对吗?我问这个问题是因为设计模式——以不同的方式谈论接口和抽象。另外,原因是JAVA有两个不同的关键字——interface和abstract。我们需要在java中实现一个接口。我们需要扩展抽象类。然而,在CPP中,我们只是继承抽象类,然后实现。
#include <iostream>
#include <string>
using namespace std;
class Part{
public:
std::string spec;
Part(std::string str){
this->spec = str;
}
std::string getSpec(){
return spec;
}
};
class Car{
public:
Part getEngine();
Part getWheels();
Part getBody();
};
class Benz:public Car{
public:
Part getEngine(){
return Part("Benz Engine");
}
Part getWheels(){
return Part("Benz Wheels");
}
Part getBody(){
return Part("Benz Body");
}
};
class Audi:public Car{
public:
Part getEngine(){
return Part("Audi Engine");
}
Part getWheels(){
return Part("Audi Wheels");
}
Part getBody(){
return Part("Audi Body");
}
}; …Run Code Online (Sandbox Code Playgroud) 我正在学习C++,我无法理解接口的工作原理.我设置了一个不起作用的小例子,我不明白我做错了什么.
我已经阅读了这个答案,这有助于我宣布界面,但(即使我仍然不完全理解声明)我现在关注的更多是关于用法.我也读过这个答案,但是,我仍然无法使用我的界面,请看这个例子:
shape.h
#ifndef SHAPE_H
#define SHAPE_H
class Shape
{
public:
virtual ~Shape(){}
virtual int getArea() = 0;
};
#endif // SHAPE_H
Run Code Online (Sandbox Code Playgroud)
rectangle.h
#ifndef RECTANGLE_H
#define RECTANGLE_H
#include "shape.h"
class Rectangle : public Shape
{
public:
Rectangle(){}
Rectangle(int w, int h) : width{w}, height{h} {}
virtual int getArea();
private:
int width = 0;
int height = 0;
};
#endif // RECTANGLE_H
Run Code Online (Sandbox Code Playgroud)
rectangle.cpp
#include "rectangle.h"
int Rectangle::getArea()
{
return width * height;
}
Run Code Online (Sandbox Code Playgroud)
weird.h
#ifndef WEIRD_H
#define …Run Code Online (Sandbox Code Playgroud) 我收到cpp编译器的警告,我似乎无法解决.我想至少明白我做错了什么......
sketch\IRectangle.h:7:20:警告:ISO C++禁止声明'Rectangle'没有类型[-fpermissive]
矩形(INT,INT);
Run Code Online (Sandbox Code Playgroud)^
头文件
#ifndef RECTANGLE_H
#define RECTANGLE_H
class IRectangle
{
public:
Rectangle(int,int);
void set_values (int,int);
int area (void);
private:
int width, height;
};
#endif
Run Code Online (Sandbox Code Playgroud)
Rectangle实现
#include "IRectangle.h"
IRectangle::Rectangle(int width, int height)
{
}
void IRectangle::set_values (int a,int b)
{
}
int IRectangle::area()
{
return 0;
}
Run Code Online (Sandbox Code Playgroud)
谷歌搜索后,我遇到了这个和这个线程,但我三重检查原型是否匹配,所以我真的无法弄清楚我做错了什么.
PS:在C++中用"I"加前缀接口是否可以?