2016-09-28 2 views
0

에서 기본 클래스의 벡터에 클래스를 파생 밀어 나는 다음과 같은 코드가 있습니다는 C++

class Official { 
    public: 
     explicit Official(int iRow, int iColumn, int iRankHolder, int** aiBoardHolder); 
}; 

class General : public Official { 
    public: 
     explicit General(int iRow, int iColumn, int iRankHolder, int** aiBoardHolder) : Official(iRow, iColumn, iRankHolder, aiBoardHolder) {}; 
}; 

class Map { 
    private: 
     std::vector<Official> aoOfficialStack; 

    public: 
     void generateOfficialObject(); 
}; 

void Map::generateOfficialObject() { 
    aoOfficialStack.push_back(General(1, 2, 3, aiBoardPosition)); 
} 

질문 왜이 오류를 얻고있다 호출 한 후를 generateOfficalObject()?

오류 C2664 '무효 표준 : : 벡터> ::와 push_back (const를 공식 &는)': \ 사용자 \ 바탕 화면 \ 프로젝트 \ 프로젝트 \ 사용자 : '공식 & &'프로젝트 C에 '일반'에서 인수 1을 변환 할 수 없습니다 \ board \ board.cpp 12

대단히 감사합니다!

+1

표시되는 오류를 생성하는 코드가 아닙니다. 'FiveStarGeneral'은 리턴 타입이 없습니다 (생성자가 아니기 때문에 클래스 이름이 다릅니다). 실제 코드를 게시하십시오. 어쨌든 Object Slicing을 찾아보십시오. 당신은 당신이 성취하고자하는 것이 현 상태로 일할 수 없음을 보게 될 것입니다. – Angew

+0

죄송합니다. 나는 이미 코드를 편집했다. 그것은 놓쳤다. 이것은 이제 실제 코드와 실제 오류입니다. 죄송합니다. – Redis1001

+1

코드가 컴파일 되더라도 예상 한대로 작동하지 않을 가능성이 있습니다. [object slicing] (http://stackoverflow.com/q/274626/2069064)을 참조하십시오. – Barry

답변

2

예제 프로그램 compiles. 예제가 불완전하거나 컴파일러가 표준을 준수하지 않습니다.

프로그램의 형식이 잘되어 있으며 동작이 정의되어 있습니다. 그러나 그 행동은 당신이 기대하는 바가 아닐 수도 있습니다. 오브젝트 슬라이싱은 초보자가 직관에 어긋나는 것을 알 수있는 모호한 언어 기능입니다. Official 하위 개체 만 사용하려는 경우 General의 인스턴스를 만드는 것은 의미가 없습니다. 자신에게 물어보십시오. 왜 처음에 Official의 인스턴스를 만들지 않습니까?

+1

정답. 나는 예제가 불완전하다고 생각한다. –

+0

예, 죄송합니다 코드는 정확하지만 다른 소스 파일에 헤더 파일을 포함하면 순환 종속성으로 인한 재 정의가 발생하므로 Visual Studio의 문제가 발생합니다. 나는 순환 의존성을 해결할 때 이미 이것을 해결했다. 고맙습니다!! – Redis1001

+0

@ Redis1001은 항상 [mcve]를 만듭니다. exmaple 코드가 문제를 재연하지 않으면 매우 유용하지 않습니다. – user2079303

0

이것은 C++ 제한 사항입니다. 파생 클래스의 값을 기본 클래스에 할당 할 수는 없습니다. 이것은 컴파일 될 수 있지만 예기치 않은 동작을 초래합니다. 객체를 기본 클래스의 인스턴스에 복사 할 수 있습니다 (파생 클래스에서 가져온 정보가 손실 됨). 이것은 object slicing

으로 참조 또는 포인터를 사용해야합니다. 당신이

std::vector<std::unique_ptr<Official>> aoOfficialStack; 

에 벡터를 변경하고 같이 지정할 수 있도록 :

aoOfficialStack.push_back(std::make_unique<General>(1, 2, 3, aiBoardPosition)); 

shared_ptr는 또한 사용에 의존하는 대안이 될 것입니다.

+0

"값으로 기본 클래스로 파생 클래스를 변경할 수 없습니다"일반 잘못되었습니다 (개체 조각이 도입 되더라도) –

+0

그래, gcc/clang에서 컴파일 된 것을 보았습니다. 하지만 그것은 VS에없는 것 같습니다. 나는 경고없이 컴파일하는 것에 놀랐다. 나는 이것을 편집 할 것이다. – Hayt

+0

VS로 컴파일하지 않으면 VS에서 "버그"입니다. 그리고 여기에 경고 할 필요가 없습니다. 객체 조각은 나쁘지 않습니다. 단지 그것을 인식하고 있어야합니다. – Holt