C++ Posao类带参构造函数与对象创建错误求助
解决Posao类带参构造函数实现及对象创建问题
嘿,我帮你把代码里的问题理清楚,然后给出修正后的完整版本,完全适配你的学校项目需求:
先说说原代码里的核心问题
- Radnik对象创建参数顺序错误:你定义的
Radnik构造函数参数顺序是(string, string, int, bool),但在main里创建对象时把int和bool的位置搞反了,比如Radnik radnikPrvi("djuro", "djuric", false, 3)里的布尔值和整数顺序颠倒,这会导致参数类型不匹配,编译直接报错。 - Posao类缺少带参构造函数:因为
Radnik没有默认构造函数(你显式写了带参构造,编译器不会自动生成默认版),而Posao继承自Radnik,同时它的私有成员是两个Radnik对象——这意味着Posao必须定义构造函数,显式初始化基类和自身的Radnik成员,否则编译器不知道怎么初始化这些对象。
修正后的完整代码
#include<iostream> #include<string> using namespace std; class Radnik { private: string ime; string prezime; int koeficijentSS; bool zaposlen; public: // 原带参构造函数保留 Radnik(string, string, int, bool); string getIme(); string getPrezime(); int getKoeficijent(); bool getStatus(); void promeniIme(string); void promeniPrezime(string); void promeniKoeficijent(int); void promeniStatus(bool); }; class Posao: public Radnik { private: Radnik radnik1; Radnik radnik2; public: // 新增Posao的带参构造函数:同时初始化基类和自身的两个Radnik成员 Posao(string baseIme, string basePrezime, int baseKoef, bool baseStatus, Radnik r1, Radnik r2) : Radnik(baseIme, basePrezime, baseKoef, baseStatus), radnik1(r1), radnik2(r2) {} void PromeniRadnik1(Radnik); void PromeniRadnik2(Radnik); }; // Radnik构造函数实现 Radnik::Radnik(string a, string b, int c, bool d) { ime = a; prezime = b; koeficijentSS = c; zaposlen = d; } // Radnik的各种getter和setter实现保留 string Radnik::getIme() { return ime; } string Radnik::getPrezime() { return prezime; } int Radnik::getKoeficijent() { return koeficijentSS; } bool Radnik::getStatus() { return zaposlen; } void Radnik::promeniIme(string e) { ime = e; } void Radnik::promeniPrezime(string f) { prezime = f; } void Radnik::promeniKoeficijent(int g) { koeficijentSS = g; } void Radnik::promeniStatus(bool h) { zaposlen = h; } // Posao的成员函数实现保留 void Posao::PromeniRadnik1(Radnik x) { radnik1.promeniIme(x.getIme()); radnik1.promeniPrezime(x.getPrezime()); radnik1.promeniKoeficijent(x.getKoeficijent()); radnik1.promeniStatus(x.getStatus()); } void Posao::PromeniRadnik2(Radnik y) { radnik2.promeniIme(y.getIme()); radnik2.promeniPrezime(y.getPrezime()); radnik2.promeniKoeficijent(y.getKoeficijent()); radnik2.promeniStatus(y.getStatus()); } int main() { // 修正Radnik对象的参数顺序:先int类型的系数,后bool类型的状态 Radnik radnikPrvi("djuro", "djuric", 3, false); Radnik radnikDrugi("momcilo", "sportista", 2, true); Radnik radnikTreci("gavrilo", "burek", 1, false); // 创建Posao对象:传入基类初始化参数+两个Radnik对象 Posao posaoProjekta("projekt", "vodja", 5, true, radnikPrvi, radnikDrugi); // 可选测试输出,验证对象是否正确创建 cout << "Posao基类成员姓名:" << posaoProjekta.getIme() << " " << posaoProjekta.getPrezime() << endl; cout << "Radnik1姓名:" << radnikPrvi.getIme() << " " << radnikPrvi.getPrezime() << endl; return 0; }
关键说明
Posao的构造函数使用了成员初始化列表(:后面的部分),这是C++中初始化基类和成员对象的标准高效方式,比在构造函数体内赋值更规范。- 修正了
main里Radnik对象的参数顺序,确保和构造函数定义的参数类型顺序完全匹配。 - 新增的测试输出可以帮你快速验证对象是否正确创建和初始化。
内容的提问来源于stack exchange,提问作者Luka Matović
相关产品推荐
相关产品推荐

