簡體   English   中英

C ++將一組對象傳遞給抽象類的成員函數

[英]C++ Passing a set of objects to a member functions of abstract class

我想將對象傳遞給類的成員函數並從其中執行一些函數。 當我使用* 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;
}

car.h

#ifndef CAR_H
#define CAR_H

#include <iostream>
#include "veicles.h"

class Car : public Veicles{
public:
    void move();

};

#endif

car.cpp

#include "car.h"

void Car::move(){

        std::cout << "the car is moving\n";
}

traffic.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

traffic.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
  void import(Car p[], int number);

是相同的

  void import(Car* p, int number);

您不能使用Vehicle*類型的參數來調用它,因為不能將基類指針自動轉換為派生類指針。

假設您有:

class Truck : public Veicles{
 ...
};

Veicles *myVeicles = new Truck[number];

如果編譯器允許您調用該函數,則您將突然能夠在需要Car地方使用Truck 那會導致災難。


以下功能有效

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();
   }
}

這樣做的原因是您可能不會將派生類對象的數組視為基類對象的數組。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM