0

これは完全なエラーメッセージです

> In file included from
> c:\mingw\bin\../lib/gcc/mingw32/4.7.2/include/c++/vector:63:0,
>                      from PlayerDatabase.h:4,
>                      from PlayerDatabase.cpp:6: 

c:\mingw\bin\../lib/gcc/mingw32/4.7.2/include/c++/bits/stl_construct.h:
> In function 'void std::_Construct(_T1*, const _T2&)':

> c:\mingw\bin\../lib/gcc/mingw32/4.7.2/include/c++/bits/stl_construct.h:85:13:
> error: expected type-specifier before 'static_cast'

> c:\mingw\bin\../lib/gcc/mingw32/4.7.2/include/c++/bits/stl_construct.h:85:13:
> error: expected ')' before 'static_cast'

> c:\mingw\bin\../lib/gcc/mingw32/4.7.2/include/c++/bits/stl_construct.h:85:13:
> error: expected ';' before 'static_cast' 

PlayerDatabase.h:4に含まれているファイルはベクターヘッダーファイルです

私はcppファイルで動的キャストを使用して、ピッチャーとヒッターのポインターを基本クラスの野球選手のポインターに変更してから、push_baxk()を介してベクターに挿入しました。これが問題ですか?

これはplayerdatabase.hファイルです

#include <vector>
#include "BaseballPlayer.h"
#include "Hitter.h"
#include "Pitcher.h"

//これはplayerdatabaseクラスの定義です

class PlayerDatabase {

public:
    PlayerDatabase();
    PlayerDatabase(PlayerDatabase&);
    PlayerDatabase& operator= (PlayerDatabase&);
    ~PlayerDatabase();
    void print_team(std::ofstream&);
    void load_team(std::ifstream&);
    void create_good_team();
    void create_small_team();
    int get_team_count();

private:
    std::vector<BaseballPlayer*> team;
};

これはplayerdatabase.cppです

#include <iomanip>
#include "cppMemDbg.h"
#include "PlayerDatabase.h"

const char HITTER='H';
const char PITCHER='P';
const int REDUCE_BY=4;

//引数のないデフォルトのコンストラクタ

PlayerDatabase::PlayerDatabase(){

}

//コピーコンストラクタ

PlayerDatabase::PlayerDatabase(PlayerDatabase& right){
std::vector<BaseballPlayer*>::iterator begin, end;
begin=right.team.begin();
end=right.team.end();

while (begin!=end){
    Pitcher* pPlayer= dynamic_cast<Pitcher*>(*begin);
    if (pPlayer){
        Pitcher* pitcher= new Pitcher(*pPlayer);
        team.push_back(dynamic_cast<BaseballPlayer*>(pitcher));
    }

    else{
        Hitter* hPlayer= dynamic_cast<Hitter*>(*begin);
        Hitter* hitter= new Hitter(*hPlayer);
        team.push_back(dynamic_cast<BaseballPlayer*>(hitter));
    }

    begin++;
}

}

//代入演算子

PlayerDatabase& PlayerDatabase::operator= (PlayerDatabase& right){
if (team==right.team)
    return *this;

else {
    std::vector<BaseballPlayer*>::iterator begin, end;
    begin=right.team.begin();
    end=right.team.end();

    while (begin!=end){

        Pitcher* pPlayer= dynamic_cast<Pitcher*>(*begin);
        if (pPlayer){
            Pitcher* pitcher= new Pitcher(*pPlayer);
            BaseballPlayer* bplayer= dynamic_cast<BaseballPlayer*>(pitcher);
            team.push_back(bplayer);
        }

        else{
            Hitter* hPlayer= dynamic_cast<Hitter*>(*begin);
            Hitter* hitter= new Hitter(*hPlayer);
            BaseballPlayer* bplayer= dynamic_cast<BaseballPlayer*>(hitter);
            team.push_back(bplayer);
        }
        begin++;
    }
}
return *this;

}

//デストラクタ

PlayerDatabase::~PlayerDatabase(){
std::vector<BaseballPlayer*>::iterator iter;
for (iter=team.begin();iter!=team.end();iter++){
    if (*iter)
        delete *iter;
    *iter=nullptr;
}
team.clear();

}

//野球選手をstdoutに出力し、指定されたファイルに書き込む関数

void PlayerDatabase::print_team(std::ofstream& outputFile){
int totalHits=0, totalAtBats=0, totalEarnedRuns=0;
float totalInningsPitched=0.0;

std::vector<BaseballPlayer*>::iterator begin, end;
begin=team.begin();
end=team.end();
int member=1;

while (begin!=end){
    std::cout<<"Member "<<member<<std::endl;
    (*begin)->print_player(outputFile);

    Pitcher* pPlayer= dynamic_cast<Pitcher*>(*begin);
    if (pPlayer){
        totalEarnedRuns+=pPlayer->earnedRuns;
        totalInningsPitched+=pPlayer->inningsPitched;
        begin++;
        member++;
    }

    else{
        Hitter* hPlayer= dynamic_cast<Hitter*>(*begin);
        totalHits+=hPlayer->hits;
        totalAtBats+=hPlayer->atBats;
        begin++;
        member++;
    }

}

if(totalAtBats==0||totalInningsPitched==0.0){

    if(totalAtBats==0&&totalInningsPitched==0.0){
        std::cout<<"Team Batting Average: "<<"n/a"<<std::endl;
        std::cout<<"Team ERA: "<<"n/a"<<std::endl;
    }
    else if (totalAtBats==0){
        std::cout<<"Team Batting Average: "<<"n/a"<<std::endl;
        std::cout<<"Team ERA: "<<(totalEarnedRuns/totalInningsPitched*9)<<std::endl;
    }
    else {
        std::cout<<"Team Batting Average: "<<std::fixed<<std::setprecision(3)<<totalHits/(double)totalAtBats<<std::endl;
        std::cout<<"Team ERA: "<<"n/a"<<std::endl;
    }
}

else{
    std::cout<<"Team Batting Average: "<<std::fixed<<std::setprecision(3)<<totalHits/(double)totalAtBats<<std::endl;
    std::cout<<"Team ERA: "<<(totalEarnedRuns/totalInningsPitched*9)<<std::endl;
}

}

//フォーマットされた入力ファイルから野球選手をロードします

void PlayerDatabase::load_team(std::ifstream& input){
int counter=1;
while (!input.eof()){
    char playerType;
    input.get(playerType);

    if (playerType==HITTER){
        Hitter* hitter= new Hitter;
        hitter->load_player(input);
        std::cout<<"Loading member "<<counter<<std::endl;
        team.push_back(dynamic_cast<BaseballPlayer*>(hitter));
        counter++;
    }

    else if (playerType==PITCHER){
        Pitcher* pitcher= new Pitcher;
        pitcher->load_player(input);
        std::cout<<"Loading member "<<counter<<std::endl;
        team.push_back(dynamic_cast<BaseballPlayer*>(pitcher));
        counter++;
    }

}

}

// goodHitter()関数とgoodPitcher()関数に基づいて一部を削除することにより、優れたチームを作成する関数

void PlayerDatabase::create_good_team(){

std::vector<BaseballPlayer*> goodTeam;

std::vector<BaseballPlayer*>::iterator begin, end;
begin=team.begin();
end=team.end();

while (begin!=end){

    Pitcher* pPlayer= dynamic_cast<Pitcher*>(*begin);
    if (pPlayer){
        if(pPlayer->goodPitcher()){

            goodTeam.push_back(dynamic_cast<BaseballPlayer*>(pPlayer));
        }
        else {
            if (*begin)
                delete *begin;
            *begin=nullptr;
        }
        begin++;
    }

    else{
        Hitter* hPlayer= dynamic_cast<Hitter*>(*begin);
        if(hPlayer->goodHitter()){
            goodTeam.push_back(dynamic_cast<BaseballPlayer*>(hPlayer));
        }
        else {
            if (*begin)
                delete *begin;
            *begin=nullptr;
        }
        begin++;
    }
}
team.clear();
team=goodTeam;

}

//ベクトルの最初の4人のプレーヤーを削除する小さなチームを作成します

void PlayerDatabase::create_small_team(){
if(get_team_count()>=REDUCE_BY){
    std::vector<BaseballPlayer*>::iterator first, fifth;
    first= team.begin();
    fifth=first+REDUCE_BY;

    while (first!=fifth){
        if (*first)
            delete *first;
        *first=nullptr;
        first++;
    }
    team.erase(team.begin(),fifth);
}

else {
    std::vector<BaseballPlayer*>::iterator first,last;
    first= team.begin();
    last=team.end();
    while(first!=last){
        if (*first)
            delete *first;
        *first=nullptr;
        first++;
    }
    team.clear();
}

}//チームメンバーの数

int PlayerDatabase::get_team_count(){
return team.size();

}

この部分に何か問題がありますか?

 std::vector<BaseballPlayer*>::iterator begin, end;
 begin=right.team.begin();
 end=right.team.end();
4

1 に答える 1

1

それはたくさんのコードです!しかし、それについて間違っていると言わせることがいくつかあります:

PlayerDatabase(PlayerDatabase&); // this is the one the error is complaining about

これにより、可変コピーコンストラクターが宣言されます。それが必要な場合は問題ありませんが、おそらくそうではありません。代わりにこれが必要です:

PlayerDatabase(PlayerDatabase const&);

ソースを変更する必要がない限り(そしてそれをしたくない場合を除いて) 、代入演算子についても同じことが言えます。

PlayerDatabase& operator= (PlayerDatabase const&);

コード全体に修飾子が1つも表示されないため、 const-correctnessconstに気付いていない可能性があります。あなたはその主題についていくらかの調査をするべきです、しかしそれは基本的に操作が与えられた引数を修正するかどうかを言います。

于 2013-01-11T18:17:38.597 に答える