【问题标题】:C++ Passing a set of objects to a member functions of abstract classC ++将一组对象传递给抽象类的成员函数
【发布时间】: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


【解决方案1】:
  void import(Car p[], int number);

相同
  void import(Car* p, int number);

您不能使用Vehicle* 类型的参数调用它,因为基类指针无法自动转换为派生类指针。

想象一下你有:

class Truck : public Veicles{
 ...
};

Veicles *myVeicles = new Truck[number];

如果编译器允许您调用该函数,您将突然能够使用Truck,而预期Car。那会导致灾难。


以下功能起作用

void Traffic::import(Veicles *v[], int number){
   vc = *v; 
   for(int i = 0; i < number; i++){
      vc -> move();
   }
}

但是,请注意您没有使用i 来访问vc 的元素。您仅在第一个对象上调用 move()

以下将是一个问题。

void Traffic::import(Veicles *v[], int number){
   vc = *v; 
   for(int i = 0; i < number; i++){
      vc[i].move();
   }
}

原因是您可能不会将派生类对象数组视为基类对象数组。

【讨论】:

  • 谢谢。用“vc [i] .move ()”替换“vc -> move ()”的解决方案更好。此外,我怀疑创建 Veicles 类的“vc”指针,因为我创建它似乎不正确。我会寻找软件架构主题来避免这种混乱。
猜你喜欢
  • 2013-12-26
  • 1970-01-01
  • 1970-01-01
  • 2018-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多