简体   繁体   English

复制构造函数使运算符重载

[英]Copy constructor overloading an operator

I have an assignment for class and i received a header file and need to implement the methods of the class. 我为课程分配了一个作业,并且收到了头文件,并且需要实现该课程的方法。 I'm having trouble with implementing the copy constructor and overloading the = operator. 我在实现复制构造函数和重载=运算符时遇到麻烦。 Here is some of the header file: 这是一些头文件:

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);
...

My attempt ate the copy constructor and = operator overloading 我的尝试吃了拷贝构造函数和=运算符重载

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

I did this by studying some code on the web and visual studio gives me an error 我通过研究网络上的一些代码来做到这一点,而Visual Studio却给我一个错误

: constructor initializer lists are only allowed on constructor definitions

Can someone explain to me how to do these two functions, because i am completely lost. 有人可以向我解释如何完成这两个功能,因为我完全迷路了。

The compiler has told you the error: constructor initializer lists are only allowed on constructor definitions. 编译器告诉您该错误:构造函数初始化列表仅允许在构造函数定义上使用。
You're implementing the copy constructor, so constructor initializer lists is not allowed, and it's only allowed on constructor while you try to use it on overloading the assignment operator. 您正在实现复制构造函数,因此不允许构造函数初始值设定项列表,并且仅当尝试在重载赋值运算符时使用它时才允许在构造函数上使用。 I'd recommend you to read these posts: Copy constructor and = operator overload in C++: is a common function possible? 我建议您阅读以下文章: 在C ++中复制构造函数和=运算符重载:是否可以使用通用函数? 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;
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM