我有一个类的分配,我收到了一个头文件,需要实现该类的方法。我在实现复制构造函数和重载=运算符时遇到了问题。 以下是一些头文件:
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
有人可以向我解释如何做这两个功能,因为我完全迷失了。
答案 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;
}