0

サブクラスにあるいくつかの文字列を表示するのに問題があります。関数でやろうとしていますが、これらの文字列の内容を取得できない理由がわかりません。

class Employee{
    string FN, LN, JT;
    double Income;

public:
    char const *getters(){
        return FN.data(), LN.data(), JT.data(); //=========>getting the content of strings
    }
    virtual char const *getAccess()=0;
    Employee(char const *fn, char const *ln, char const *jt, double inc){

        if(fn==0) throw Exception(1, "Sorry, First Name is Null");
        if(ln==0) throw Exception(2, "Sorry, Last Name is Null");
        if(jt==0) throw Exception(3, "Sorry Job Title is Null");
        if(inc<=0) throw Exception(4, "Sorry, The Income is Null");

        FN=fn;
        LN=ln;
        JT=jt;
        Income=inc;
    }
};

class Programmer: public Employee{
public:
    Programmer(char const *fn, char const *ln, double inc):
        Employee(fn,ln,"Programmer", inc)
    {}
    char const *getAccess(){
        return "You have access to Meeting Room + Development Office";
    }
};

//=========The Main============
int main(){
    Employee *acc[3];

    try{
        acc[0]=new Programmer("Juan", "Villalobos", 60000);
        acc[1]=new Director("Jorge", "Villabuena", 70000);
        acc[2]=new ProdSupport("Pedro", "Villasmil", 80000);
        for(int i=0; i<3; i++){
            cout << acc[i]->getters() << endl;    //=============>Displaying the strings
            cout << acc[i]->getAccess() << endl;
        }
    } catch(Exception acc){
        cout << "Err:" << acc.getErrCode() << " Mess:" << acc.getErrMess() << endl;
    }

    return 0;
}

だから、私の機能は私が望むことをしていないと推測しています。それは名と姓を表示することです。私は何を間違っていますか?

4

2 に答える 2

1

char*とを混ぜる意味がわからないstring。後者を優先します。

これはコンパイルします

char const *getters(){
    return FN.data(), LN.data(), JT.data();
}

しかし、おそらくあなたが望むのは

char const *getters(){
    return (FN + LN + JT).data();
}

私はあなたのプログラムを次のように書き直します:

class Employee{
    string FN, LN, JT;
    double Income;

public:
    string getters(){
        return FN + " " + LN + " " + JT;
    }

    virtual string getAccess()=0;

    Employee(string const &fn, string const &ln, string const &jt, double inc) :
        FN(fn), LN(ln), JT(jt), Income(inc)
    {
    }
};

class Programmer: public Employee{
public:
    Programmer(string const &fn, string const &ln, double inc):
        Employee(fn,ln,"Programmer", inc)
    {}

    string getAccess(){
        return "You have access to Meeting Room + Development Office";
    }
};

//=========The Main============
int main()
{
    std::vector<Employee> acc;

    acc.push_back(Programmer("Juan", "Villalobos", 60000));
    acc.push_back(Director("Jorge", "Villabuena", 70000));
    acc.push_back(ProdSupport("Pedro", "Villasmil", 80000));

    for(size_t i=0; i<acc.size(); i++){
        cout << acc[i].getters() << endl;
        cout << acc[i].getAccess() << endl;
    }

    return 0;
}
于 2013-08-12T22:45:23.310 に答える
1

コンマ演算子の結果は,右側の値であるため、return FN.data(), LN.data(), JT.data();事実上、表示されている と同じreturn JT.data();です。

あなたが試みていることを行うには、代わりにこれを試してください:

std::vector<std::string> getValues() const {
    std::vector<std::string> arr(3);
    arr.push_back(FN);
    arr.push_back(LN);
    arr.push_back(JT);
    return arr;
}

std::vector<std::string> arr = acc[i]->getValues();
for (std::vector<std::string>::const_iterator iter = arr.begin(), end = arr.end(); iter != end; ++iter) {
    cout << *iter << " ";
}
cout << endl;

または、coutロジックをクラス自体に移動します。

void displayValues() const {
    cout << FN << " " << LN << " " << JT << endl;
    cout << getAccess() << endl;
}

for(int i=0; i<3; i++){
    acc[i]->displayValues();
}
于 2013-08-12T22:40:34.283 に答える