我可以用相同的参数创建多个构造函数吗
Can I create multiple constructors with the same arguments
我是 C++ 的新手,我很想知道您是否可以使用相同的参数创建多个构造函数。例如,我有这个 class,其中有患者,我有他们的姓名和年龄。我知道我可以创建这样的构造函数:
class hospital {
hospital(){
setname("John");
setage(24);
}
private:
string name;
int age;
};
但是我可以像上面那样创建另一个构造函数吗?类似于:
hospital patientBilly(){
setname("Billy");
setage(32);
}
如果我没理解错,那么你需要定义两个构造函数
hospital( const std::string &name, int age )
{
setname( name );
setage( age );
}
hospital() : hospital( "John", 24 )
{
}
然后你可以写声明class
的一个对象
hospital patientBilly( "Billy", 32 );
问题是你重新定义了构造函数。允许只有一个定义。
简化示例:
void myFunc (){};
void myFunc (){};
int
main ()
{
myFunc ();
}
我要把医院class改成这样:
#include <string>
struct Hospital // struct here to signal we have no invariant. you could also use a class and make the member public
{
std::string name{}; // no setter and getter if you do not have invariant.
int age{};
};
int
main ()
{
auto hospital = Hospital{ .name = "John", .age = 42 }; //c++20 Designated Initializers so we can construct Hospital with a name and age without defining a constructor
}
相信你目前只是有点迷茫。所以让我们把事情整理好...
A class 描述了对象的行为方式。构造函数是该描述的一部分,等于它稍后将创建的所有实例。你理解的第一步应该是:有一个class和多个instances/objects。
所以你写一个 class 并为每个 instances/objects 提供不同的参数以获得不同的对象。
示例:
class hospital {
public:
hospital(const std::string& name_, int age_ ):
name { name_ }, age{ age_ }{
}
void Print() const
{
std::cout << "Hospital" << name << ":" << age << std::endl;
}
private:
std::string name;
int age;
};
int main()
{
hospital hospital1{ "John", 24 };
hospital hospital2{ "Bill", 77 };
hospital1.Print();
hospital2.Print();
}
您 可以 也为您以后创建的每个对象创建一个不同的 class,但我相信这绝不是您想要做的,尤其是在开启您的 C++ 职业生涯!
如果您想创建某种实例列表,您可以将对象存储在容器中,并根据需要对容器进行操作。
int main()
{
std::vector< hospital > objs;
objs.emplace_back( "John", 24 );
objs.emplace_back( "Bill", 77 );
for ( const auto& hos: objs )
{
hos.Print();
}
}
在您的问题中,您有两个概念,您试图将它们混合在一起。
医院和病人。因此将它们建模为两个不同的 类.
是有意义的
通过这种方式,您可以将患者建模为具有年龄和姓名的对象。
医院是“容纳”病人的东西。
给病人一个可以传递年龄和姓名的构造函数。
并给医院增加病人的方法或方法。
在示例中,我展示了如何将患者添加到医院的变体。
我还使用无符号变量类型来表示永远不会小于 0 的数字。我在代码中经常使用 const 关键字来表示值只能被使用且不应更改的地方。
#include <iostream>
#include <string>
#include <utility>
#include <vector>
//---------------------------------------------------------------------------------------------------------------------
class patient_t
{
public:
// You need a constructor like this
patient_t(const unsigned int age, const std::string& name ) :
m_age{ age },
m_name{ name }
{
}
// getter function for observing private data
const unsigned int& age() const noexcept
{
return m_age;
}
// getter function for observing private data
const std::string& name() const noexcept
{
return m_name;
}
private:
unsigned int m_age;
std::string m_name;
};
// a useful output function to have (will make code later shorter)
std::ostream& operator<<(std::ostream& os, const patient_t& patient)
{
os << "Patient : " << patient.name() << ", age : " << patient.age() << std::endl;
return os;
}
//---------------------------------------------------------------------------------------------------------------------
class hospital_t
{
public:
void add_patient(const unsigned int age, const std::string& name)
{
m_patients.emplace_back(age,name); // will call patient constructor with two parameters age and name and puts it into vector
}
void add_patient(const patient_t& patient)
{
m_patients.push_back(patient); // store a copy of patient in the vector
}
const auto& patients() const
{
return m_patients;
}
private:
std::vector<patient_t> m_patients;
};
//---------------------------------------------------------------------------------------------------------------------
int main()
{
hospital_t hospital;
patient_t billy{ 42, "Billy" };
hospital.add_patient(billy);
hospital.add_patient(31, "Jane");
for (const auto& patient : hospital.patients())
{
std::cout << patient;
}
}
我是 C++ 的新手,我很想知道您是否可以使用相同的参数创建多个构造函数。例如,我有这个 class,其中有患者,我有他们的姓名和年龄。我知道我可以创建这样的构造函数:
class hospital {
hospital(){
setname("John");
setage(24);
}
private:
string name;
int age;
};
但是我可以像上面那样创建另一个构造函数吗?类似于:
hospital patientBilly(){
setname("Billy");
setage(32);
}
如果我没理解错,那么你需要定义两个构造函数
hospital( const std::string &name, int age )
{
setname( name );
setage( age );
}
hospital() : hospital( "John", 24 )
{
}
然后你可以写声明class
的一个对象hospital patientBilly( "Billy", 32 );
问题是你重新定义了构造函数。允许只有一个定义。 简化示例:
void myFunc (){};
void myFunc (){};
int
main ()
{
myFunc ();
}
我要把医院class改成这样:
#include <string>
struct Hospital // struct here to signal we have no invariant. you could also use a class and make the member public
{
std::string name{}; // no setter and getter if you do not have invariant.
int age{};
};
int
main ()
{
auto hospital = Hospital{ .name = "John", .age = 42 }; //c++20 Designated Initializers so we can construct Hospital with a name and age without defining a constructor
}
相信你目前只是有点迷茫。所以让我们把事情整理好...
A class 描述了对象的行为方式。构造函数是该描述的一部分,等于它稍后将创建的所有实例。你理解的第一步应该是:有一个class和多个instances/objects。
所以你写一个 class 并为每个 instances/objects 提供不同的参数以获得不同的对象。
示例:
class hospital {
public:
hospital(const std::string& name_, int age_ ):
name { name_ }, age{ age_ }{
}
void Print() const
{
std::cout << "Hospital" << name << ":" << age << std::endl;
}
private:
std::string name;
int age;
};
int main()
{
hospital hospital1{ "John", 24 };
hospital hospital2{ "Bill", 77 };
hospital1.Print();
hospital2.Print();
}
您 可以 也为您以后创建的每个对象创建一个不同的 class,但我相信这绝不是您想要做的,尤其是在开启您的 C++ 职业生涯!
如果您想创建某种实例列表,您可以将对象存储在容器中,并根据需要对容器进行操作。
int main()
{
std::vector< hospital > objs;
objs.emplace_back( "John", 24 );
objs.emplace_back( "Bill", 77 );
for ( const auto& hos: objs )
{
hos.Print();
}
}
在您的问题中,您有两个概念,您试图将它们混合在一起。 医院和病人。因此将它们建模为两个不同的 类.
是有意义的通过这种方式,您可以将患者建模为具有年龄和姓名的对象。 医院是“容纳”病人的东西。
给病人一个可以传递年龄和姓名的构造函数。 并给医院增加病人的方法或方法。 在示例中,我展示了如何将患者添加到医院的变体。
我还使用无符号变量类型来表示永远不会小于 0 的数字。我在代码中经常使用 const 关键字来表示值只能被使用且不应更改的地方。
#include <iostream>
#include <string>
#include <utility>
#include <vector>
//---------------------------------------------------------------------------------------------------------------------
class patient_t
{
public:
// You need a constructor like this
patient_t(const unsigned int age, const std::string& name ) :
m_age{ age },
m_name{ name }
{
}
// getter function for observing private data
const unsigned int& age() const noexcept
{
return m_age;
}
// getter function for observing private data
const std::string& name() const noexcept
{
return m_name;
}
private:
unsigned int m_age;
std::string m_name;
};
// a useful output function to have (will make code later shorter)
std::ostream& operator<<(std::ostream& os, const patient_t& patient)
{
os << "Patient : " << patient.name() << ", age : " << patient.age() << std::endl;
return os;
}
//---------------------------------------------------------------------------------------------------------------------
class hospital_t
{
public:
void add_patient(const unsigned int age, const std::string& name)
{
m_patients.emplace_back(age,name); // will call patient constructor with two parameters age and name and puts it into vector
}
void add_patient(const patient_t& patient)
{
m_patients.push_back(patient); // store a copy of patient in the vector
}
const auto& patients() const
{
return m_patients;
}
private:
std::vector<patient_t> m_patients;
};
//---------------------------------------------------------------------------------------------------------------------
int main()
{
hospital_t hospital;
patient_t billy{ 42, "Billy" };
hospital.add_patient(billy);
hospital.add_patient(31, "Jane");
for (const auto& patient : hospital.patients())
{
std::cout << patient;
}
}