我可以用相同的参数创建多个构造函数吗

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