You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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ć

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 07:21:02