我们假设我有以下情况:
ora-12504:tns:listener was not given the SERVICE_NAME in CONNECT_DATA
我想创建一个"复制构造函数"我从class NamedObject{
public:
NamedObject(const std::string &name):name_{std::move(name)}{}
private:
const std::string name_;
}
class Person: public NamedObject{
public:
Person(const std::string &name, int age): NamedObject(name), age_{age}{}
private:
int age_;
}
复制所有成员但更改名称(无论出于何种原因)。
Person
现在假设我不仅有一个属性,如class Person: public NamedObject{
public:
Person(const std::string &name, int age): NamedObject(name), age_{age}{}
Person(const std::string &newName, const Person &other): NamedObject(name){
age_ = other.age;
}
private:
int age_;
}
,还有很多属性,在开发过程中它们会发生很大的变化。是否可以轻松地创建像age
这样的函数而无需手动复制Person(const std::string &newName, const Person &other)
等所有属性。我的想法是,在开发过程中,如果我添加一个新属性,我不必总是记得改变这个构造函数。
请注意,我不能简单地更改名称,因为它是age_ = other.age;
。
答案 0 :(得分:0)
您可以在NamedObject
上定义一个什么都不做的赋值运算符。然后,您就可以在“复制构造函数”中使用*this = other
:
class NamedObject{
public:
NamedObject(const std::string &name):name_{name}{}
NamedObject &operator= (const NamedObject &) {
return *this;
}
const std::string name_;
};
class Person: public NamedObject{
public:
Person(const std::string &name, int age): NamedObject(name), age_{age}{}
Person(const std::string &newName, const Person &other): NamedObject(newName){
*this = other;
}
int age_;
};
实例:https://onlinegdb.com/rJ4J5oy3M
为什么会这样:
C ++将自动为符合条件的类定义复制赋值运算符(有关符合条件的含义的详细信息,请查看以下链接)。来自cppreference:
如果既未删除隐式声明的复制赋值运算符 它也是定义的(也就是说,生成一个函数体并且 编译)编译器如果使用odr。对于工会类型, 隐式定义的复制分配复制对象表示 (如std :: memmove)。对于非联合类类型(类和结构), 运算符执行对象的成员方式复制分配 base和非静态成员,按其初始化顺序,使用 标量和副本赋值运算符的内置赋值 班级类型。
因此,对于您的示例,隐式定义的复制赋值运算符(当我们执行*this = other;
时调用的运算符)将定义如下:
NamedObject
的复制赋值运算符来复制基类(我们定义为什么都不做,因此它不会复制name_
),age_
的复制赋值运算符以及您添加到该类的任何其他成员。