현재 std :: vector에서 파생되어야하는 클래스를 만들고 있습니다. 나는 이것을하는 것이 아마도 나쁘다는 것을 알고 있지만 나는 그렇게해야한다. 이제 내 질문은 멤버 함수에서 생성 된 벡터에 액세스하여 기본적으로 클래스가 정수의 일반 벡터처럼 액세스하도록 만드는 방법입니다. 예를 들어, 벡터의 첫 번째 항을 반환하기 위해 myVector.at (0)에 해당하는 것을 찾고 있습니다. 또한 벡터의 크기는 항상 6이어야합니다. 지금까지 가지고있는 코드는 다음과 같습니다.
class aHistogram : public vector<int>
{
public:
aHistogram(); //default constructor for histogram class
void update(int face); //Function to update histogram
void display(int maxLengthOfLine); //Displays histogram to the scale of maxLengthOfLine using x's
void clear();//Function to clear histogram bin counts
int count(int face) const; // Function to return number of times a face has appeared
private:
int numx, m, j; //Variables used in functions
};
#endif
클래스가 자체적으로 액세스해야하는 함수는 다음과 같습니다. "myVector"라는 벡터가 없다는 것을 알고 있지만 제가 잃어버린 것은 작업을 수행 할 수있는 동등한 구문입니다.
void aHistogram::clear()
{
//Clears bin counts to 0
myVector.at(0) = 0;
myVector.at(1) = 0;
myVector.at(2) = 0;
myVector.at(3) = 0;
myVector.at(4) = 0;
myVector.at(5) = 0;
}
문제의 함수가 파생 클래스에서 재정의되지 않은 경우 호출 할 수 있습니다.
void HistoGram::clear()
{
at( 0 ) = 0;
// ...
}
이것은 연산자에도 해당되지만 (*this)
왼손 연산자 로 사용해야 합니다.
void HistoGram::clear()
{
(*this)[0] = 0;
// ...
}
함수 또는 연산자가 재정의 된 경우 함수 이름을 한정해야합니다.
void HistoGram::clear()
{
std::vector<int>::at( 0 ) = 0;
// ...
}
또는 this 포인터를 기본 클래스 유형으로 캐스팅합니다.
void HistoGram::clear()
{
(*static_cast<std::vector<int>*>( this ))[0] = 0;
// ...
}
하지만 여기서 공개 상속을 원하십니까? 벡터의 크기는 항상 6이어야한다고 말합니다. public 상속을 사용한다고 보장 할 수있는 방법은 없습니다. 최소한 개인 상속이 필요 using
하고 지원하려는 작업에 대한 선언이 필요합니다. ( std::vector
개인 상속을 사용하여 구현 한 이와 같이 제한해야하는 몇 가지 경우가 있습니다. 예를 들어 const
함수 버전 만 노출하고 싶을 때 함수를 전달하기도 합니다.)
또한 std::vector<>::at
적절한 경우가 거의 없습니다 . []
대부분의 최신 구현에서 얻을 수있는 경계 검사로 원하지 않습니까?
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다