在 C++ 中将一个接口克隆到另一个相同类型的接口中

clone one interface in another of the same type in c++

我想复制一个特定类型接口的一个对象和另一个相同接口的对象,这里我将写 2 class 个示例及其输出。

这是class车辆:

#ifndef _VEHICLE_
 #define _VEHICLE_


class Vehicle {
public:
    Vehicle(int a): val(a) {}
    virtual ~Vehicle() {}
    virtual void setVal(int i) = 0;
    virtual int getVal() = 0;
protected:
int val;

};

#endif

这是class车

 #ifndef _CAR_
 #define _CAR_
#include "Vehicle.h"

class Car : public Vehicle {
public:
    Car(int a) : Vehicle(a) {}
    ~Car() {}
    virtual void setVal(int i);
    virtual int getVal();
};

#endif

class 汽车的两种方法只是 return 值并像名称建议的那样修改它。

这是主要代码

    #include <iostream>
    #include "Vehicle.h"
    #include "Car.h"

    using namespace std;

int main()
{
    Vehicle * car1 = new Car(0);
    Vehicle * car2 = new Car(1);
    cout << "val car1 :"<< car1->getVal() << endl; 
    cout << "val car2 :"<< car2->getVal() << endl; 
    car1 = car2;
    cout << "val car1 :"<< car1->getVal() << endl; 
    cout << "val car2 :"<< car2->getVal() << endl; 
    car2->setVal(6);
    cout << "val car1 :"<< car1->getVal() << endl; 
    cout << "val car2 :"<< car2->getVal() << endl;
    car1->setVal(-1);
    cout << "val car1 :"<< car1->getVal() << endl; 
    cout << "val car2 :"<< car2->getVal() << endl;
    return 0;
}

输出将是:

val car1 :0                                                                                                                                                                                                          
val car2 :1

val car1 :1                                                                                                                                                                                                          
val car2 :1 

val car1 :6                                                                                                                                                                                                          
val car2 :6  

val car1 :-1                                                                                                                                                                                                         
val car2 :-1 

如您所见,同一个接口有两个不同的对象,但是由于两个对象都必须是指针,因为它是一个接口,所以不可能只复制对象而不是分配指针"car2" 到 "car1".

我的问题是是否有任何方法可以做到这一点,或者我只需要制作一个 "clone" 方法。

感谢您的关注,如果问题很基础,我很抱歉,但我是从 C++ 开始的,有些事情有点复杂。

是的,我试图创建一个引用而不是一个指针,但它给出了下一个错误: [错误:从 'Car' 类型的右值对 'Vehicle&' 类型的非常量引用进行无效初始化]

它谈到制作一个常量引用,但我认为制作一个常量对象的副本是不可能的。顺便说一句,这只是我在 5 分钟内编写的代码,目的是让问题更清楚,真正的问题是 class 充满向量和其他对象(非常大,这就是为什么我避免使用 clone() 方法)

已解决!在重载“=”之后,异常是 auxPop 的空指针,我创建了一些新的构造函数,现在它可以工作了。感谢大家!

car1 = car2;

以上是错误的,因为car1记忆还没有被删除。 相反,您先删除 car1

delete car1;
car1 = car2;

如果您想将 car2 复制到 car1 中,这样它们就不会指向同一块内存,您可以创建一个赋值运算符:

class Car {
public:
    Car& operator=(const Car& other)
        {
            this->val = other.val;
            return *this;
        }
};

在赋值运算符的情况下,您不必删除第一个指针,第一个对象将被覆盖

    *car1 = *Car2; // assign objects, not pointers

现在汽车不会互相干扰,终于摧毁汽车..

delete car1;
delete car2;

您可以创建一个 clone() 方法,但它更像是 Java 方式。在 C++ 中,您宁愿使用复制构造函数。当您不指定时,编译器会创建它,如下所示:

 Vehicle(const Vehicle& a): val(a.val) {}
 Car(const Car& a): Vehicle(a) {}

注意:如果您需要做的不仅仅是复制内容,您也可以自己创建它们。

然后你可以像这样使用这些构造函数:

 Vehicle* a = new Car(1); // new object
 cout << a->getVal() << endl; // prints 1

 Vehicle* b = new Car(a); // here create a copy of a
 cout << b->getVal() << endl; // prints 1

 a->setVal(3);
 cout << a->getVal() << endl; // prints 3
 cout << b->getVal() << endl; // prints 1

另外:当你用 new 创建对象时不要忘记使用 delete:

 delete a;
 delete b;

在您的代码中,您在使用 car2 重新分配指针之前没有删除 car1,导致内存泄漏。

只需使用

*car1 = *car2;

取消引用那些指针以对实际对象进行操作。我总是忘记数我的星星。这将调用默认的复制函数,如果你使 class 比单个整数更复杂,但是,你可能想要添加一个显式复制函数,这样写;

class Car : public Vehicle
{
    ...
    Car& operator=(const Car& eql);
    ...
}

Car& Car::operator=(const Car& eql){
    val = eql.val;
    return *this;
}