在 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;
}
我想复制一个特定类型接口的一个对象和另一个相同接口的对象,这里我将写 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;
}