Я не могу понять как использовать переменную в конструкторе производного класса
Вот мои два класса, подскажите как использовать переменную int m_charge в конструкторе производного класса Videoplayer, выбивает ошибку
class CDevice
{
protected:
int m_charge;
string ptr_DeviceName;
public:
CDevice()
{
cout << ""<<endl;
}
virtual ~CDevice()
{
cout << "" << endl;
}
CDevice(int charge, string DeviceName)
: m_charge(charge), ptr_DeviceName(DeviceName)
{
}
void Setcharge(int m_charge)
{
this->m_charge = m_charge;
}
void SetDevicename(string ptr_DeviceName)
{
this->ptr_DeviceName = ptr_DeviceName;
}
virtual void ShowInformation() = 0;
};
class CVideoplayer :virtual public CDevice
{
private:
int m_quality;
string ptr_Videoname;
public:
CVideoplayer(int quality, string Videoname, int Charge)
:m_quality(quality), ptr_Videoname(Videoname), m_charge(Charge)
{
}
void Setquality(int m_quality)
{
this->m_quality = m_quality;
}
int Getquality()
{
return m_quality;
}
void SetVideoname(string ptr_Videoname)
{
this->ptr_Videoname = ptr_Videoname;
}
string GetVideoname()
{
return ptr_Videoname;
}
void ShowInformation()
{
cout << "Name: " << ptr_Videoname << endl;
cout << "Quality: " << m_quality << endl;
cout << "Charge: " << << endl;
}
};
int main()
{
CVideoplayer ch(720, "Mark", 7);
ch.ShowInformation();
}
Ответы (2 шт):
Вызывайте весь конструктор базового класса:
CVideoplayer(int quality, string Videoname, int Charge)
:CDevice(Charge, ""), m_quality(quality), ptr_Videoname(Videoname)
{
}
Конструировать чужие переменные нельзя. Только попозже в теле конструктора вы можете переменную модифицировать.
Порядок инициализации объекта :
class A{
public :
A ( ) : p { 0 } { }
protected :
int p ;
};
class B : public A {
public :
B ( ) : A { } , i { } { p = 1 ; }
int i;
};
При создании объекта B сначала вызывается конструктор A. В конструкторе A все личные переменные будут уже инициализированы. Затем у локальных переменных класса B. После всех вызовов конструкторов вы можете модифицировать (не инициализировать) переменную у базового класса.
У вас это так :
CVideoplayer(int quality, string Videoname, int Charge)
:m_quality(quality), ptr_Videoname(Videoname)
{
m_charge = Charge ;
}
Сначала будет вызван конструктор по-умолчанию CDevice::CDevice(), потом вы проставите свои переменные и дальше модифицируете m_charge.
Или можно создать конструктор в базовом классе, принимающий один аргумент charge. Тогда просто отдайте этот аргумент ему.
CDevice(int c):m_charge(c)
{ }
CVideoplayer(int quality, string Videoname, int Charge)
:CDevice(Charge),m_quality(quality), ptr_Videoname(Videoname)
{
}