【发布时间】:2019-01-26 19:48:32
【问题描述】:
我想将对象传递给类的成员函数并在其中执行一些函数。当我使用 *myCars 指针执行此操作时,一切正常。但是当我尝试通过它对纯虚拟类执行相同的操作时,程序会返回错误(请参阅解决方案 A)。我有一个临时解决方案(请参阅解决方案 B),但对我来说似乎不合适。有什么办法解决吗?
main.cpp
#include <iostream>
#include "car.h"
#include "veicles.h"
#include "traffic.h"
int main(){
int number = 3;
Car *myCars = new Car[number];
Traffic mtc;
mtc.import(myCars, number);
Veicles *myVeicles = new Car[number];
// Solution A
// Traffic mtvA;
// mtvA.import(myVeicles, number);
// Solution B
std::cout << "\nsolution B\n";
Traffic mtvB;
mtvB.import(&myVeicles, number);
delete[] myCars;
delete[] myVeicles;
return 0;
}
汽车.h
#ifndef CAR_H
#define CAR_H
#include <iostream>
#include "veicles.h"
class Car : public Veicles{
public:
void move();
};
#endif
汽车.cpp
#include "car.h"
void Car::move(){
std::cout << "the car is moving\n";
}
交通.h
#ifndef TRAFFIC_H
#define TRAFFIC_H
#include "car.h"
class Traffic{
public:
void import(Car p[], int number);
void import(Veicles *v[], int number);
private:
Veicles *vc;
};
#endif
流量.cpp
#include "traffic.h"
#include "car.h"
void Traffic::import(Car p[], int number){
for(int i = 0; i < number; i++){
p[i].move();
}
}
void Traffic::import(Veicles *v[], int number){
vc = *v;
for(int i = 0; i < number; i++){
// vc -> move();
vc[i].move(); // EDIT: R Sahu sugestion
}
}
veicles.h
#ifndef VEICLES_H
#define VEICLES_H
class Veicles{
public:
virtual void move() = 0;
};
#endif
veicles.cpp
#include "veicles.h"
// some stuffs to do latter..
制作文件
all: clean car veicles traffic main
g++ car.o traffic.o main.o -o main.out
run:
./main.out
car: car.h
g++ -c car.cpp -o car.o
veicles: car.h veicles.h
g++ -c veicles.cpp -o veicles.o
traffic: traffic.h car.h
g++ -c traffic.cpp -o traffic.o
main: traffic.h car.h
g++ -c main.cpp -o main.o
clean:
rm -f *.o
rm -f *.gch
【问题讨论】:
-
解决方案 A:从主函数中,您似乎正在传递一个指向
Cars数组的指针(但指针的类型为Veicles)。由于指针的类型为Veicles,因此会调用来自class Veicles的抽象函数。而且由于它是一个抽象的虚函数......产生了一个疯狂的错误。 -
小心术语。您不会将对象传递给类。您将对象传递给类的成员函数。
-
@PeteBecker,我改了标题。谢谢。
-
代码意义不大。这不是您在 C++ 中使用继承的方式。
Veicles *myVeicles = new Car[number];是一个非常常见的错误,不幸的是编译器没有捕捉到。你不能这样做(一旦你开始向你的 Car 类添加数据,你就会发现很难)。这是作业吗? -
@n.m.这是我为了解释问题所做的另一个项目的简化。不幸的是,我应该选择另一个函数与 Car 类共享,因为每辆车都可以以相同的方式移动。但是,如果您替换函数“load_material ()”,例如,它可能更有意义。只有卡车(它们也是车辆)才能完成这项任务,但有些有垃圾场,有些则携带集装箱,并且会以不同的方式完成。
标签: c++ object inheritance abstract pure-virtual