复制构造函数重载操作符

时间:2014-04-11 00:28:41

标签: c++ pointers constructor copy overloading

我有一个类的分配,我收到了一个头文件,需要实现该类的方法。我在实现复制构造函数和重载=运算符时遇到了问题。 以下是一些头文件:

class MontaznaKuca
{
private:
    double kvadratura;
    string bojaFasade;
    string vlasnik;
    bool postojiVrt;
    Kuhinja* kuhinja;
    vector<Soba*> sobe; //Soba is a seperate class defined in another header 
public:
    MontaznaKuca(void);
    MontaznaKuca(double kvadratura, string bojaFasade, string imaVrt);
    MontaznaKuca(const MontaznaKuca& kuca);
    ~MontaznaKuca(void);

    MontaznaKuca& operator=(const MontaznaKuca& kuca);
...

我的尝试吃了复制构造函数和=运算符重载

MontaznaKuca::MontaznaKuca(const MontaznaKuca& kuca) : sobe(kuca.sobe.size())
{
    kvadratura = kuca.kvadratura;
    bojaFasade = kuca.bojaFasade;
    vlasnik = kuca.vlasnik;
    postojiVrt = kuca.postojiVrt;
    kuhinja = new Kuhinja;
    kuhinja = kuca.kuhinja;
    for (size_t i = 0; i < kuca.sobe.size(); ++i)
        sobe[i] = new Soba(*kuca.sobe[i]);

}

MontaznaKuca& MontaznaKuca::operator=(const MontaznaKuca& kuca) : sobe(kuca.sobe.size())
{
    kvadratura = kuca.kvadratura;
    bojaFasade = kuca.bojaFasade;
    vlasnik = kuca.vlasnik;
    postojiVrt = kuca.postojiVrt;
    kuhinja = new Kuhinja;
    kuhinja = kuca.kuhinja;
    for (size_t i = 0; i < kuca.sobe.size(); ++i)
        sobe[i] = new Soba(*kuca.sobe[i]);
    return *this;
}

我是通过研究网络上的一些代码来实现这一点的,而visual studio给我一个错误

: constructor initializer lists are only allowed on constructor definitions

有人可以向我解释如何做这两个功能,因为我完全迷失了。

1 个答案:

答案 0 :(得分:0)

编译器告诉您错误:构造函数初始化列表仅允许在构造函数定义中使用 您正在实现复制构造函数,因此不允许构造函数初始化程序列表,并且只有在尝试使用它来重载赋值运算符时才允许它在构造函数上。我建议您阅读这些帖子:Copy constructor and = operator overload in C++: is a common function possible? What is the copy-and-swap idiom?

MontaznaKuca::MontaznaKuca(const MontaznaKuca& kuca)
{
    kvadratura = kuca.kvadratura;
    bojaFasade = kuca.bojaFasade;
    vlasnik = kuca.vlasnik;
    postojiVrt = kuca.postojiVrt;
    kuhinja = new Kuhinja;
    kuhinja = kuca.kuhinja;

    for (size_t i = 0; i < kuca.sobe.size(); ++i)
        sobe.push_back(new Soba(*kuca.sobe[i]) ); 
}

MontaznaKuca& MontaznaKuca::operator=(const MontaznaKuca& kuca)
{
    // copy-swap idiom is a better approach.
    kvadratura = kuca.kvadratura;
    bojaFasade = kuca.bojaFasade;
    vlasnik = kuca.vlasnik;
    postojiVrt = kuca.postojiVrt;
    delete kuhinja; //deallocate old memory
    kuhinja = new Kuhinja;
    kuhinja = kuca.kuhinja;
    // before allocating new memory you need deallocate old memory
    ...
    for (size_t i = 0; i < kuca.sobe.size(); ++i)
        sobe.push_back(new Soba(*kuca.sobe[i]) );
    return *this;
}