를 만드는 것이 가능합니다 벡터의 포인터?
-
03-07-2019 - |
문제
지 궁금하기 때문에,문제의 실행하고 있으로,그것을 만들 수 벡터의 포인터?고 할 수 있다면,어떻게 해야 하나요?특별히 관를 사용하여 반복기도와.begin()으로 it,ie:어떻게 나는 차례로 이 벡터를 벡터로 포인:
class c
{
void virtual func();
};
class sc:public c
{
void func(){cout<<"using func";}
};
sc cobj;
vector<c>cvect
cvect.push_back(cobj);
vector<c>::iterator citer
for(citer=cvect.begin();citer<cvect.end();citer++)
{
citer->func();
}
해결책 2
vector <c> cvect
포인터의 벡터가 아닙니다. 유형 C의 객체의 벡터입니다. 당신은 원합니다 vector <c*> cvect
. 그리고 당신은 아마 원할 것입니다 :
cvect.push_back( new c );
그리고 반복자가 주어지면 다음과 같은 것을 원합니다.
(*it)->func();
물론, 당신이 처음에 포인터의 벡터를 원하지 않았을 것입니다 ...
다른 팁
확신하는.
vector<c*> cvect;
cvect.push_back(new sc);
vector<c*>::iterator citer;
for(citer=cvect.begin(); citer != cvect.end(); citer++) {
(*citer)->func();
}
명심해야 할 사항 :
내 예에서와 같이 동적으로 할당 된 메모리를 사용하는 경우 자신의 후에 정리해야합니다.
예 :
for(...) { delete *i; }
벡터를 사용하여 단순화 할 수 있습니다 shared_ptr
s (같은 boost::shared_ptr
). 사용하려고하지 마십시오 std::auto_ptr
이를 위해서는 작동하지 않습니다 (컴파일되지 않음).
명심해야 할 또 다른 사항은 사용하지 않아야합니다. <
가능한 경우 루프의 반복자를 비교하려면 임의의 액세스 반복기를 모델링하는 반복자에게만 작동합니다. 즉, 코드를 변경하여 예를 들어 A를 사용할 수 없습니다. std::list
.
네,그것이 가능하고,사실 그것은 요 포인터를 이용하기 위하려는 경우 귀하의 벡터를 포함체에서는 전체 클래스 계층구조보다는 하나의 유형입니다.(사용하지 못하는 포인터에서 발생 지칠대로 지친의 문제 개체의 슬라이스 -모든 개체가 자동으로 변환되는 기본 클래스 형식입니다.이것이 진단되지 않은 컴파일러에 의해,그리고 거의 확실히 당신이 원하는 것이 아니다.)
class c
{
void virtual func();
};
class sc:public c
{
void func(){cout<<"using func";}
};
sc cobj;
vector<c*> cvect; // Note the type is "c*"
cvect.push_back(&cobj); // Note the "&"
vector<c*>::iterator citer;
for(citer=cvect.begin();citer != cvect.end();citer++) // Use "!=" not "<"
{
(*citer)->func();
}
참고하는 벡터의 포인터 당신이해야 할 당신의 자신의 메모리 management, 므로 매우 주의해야--를 사용하게 될 경우 지체(위),그들은 빠지지 범위를 벗어나기 전에는 컨테이너 않습니다.당신이 사용하는 경우 포인터를 객체로 만든 new
, 해야 합니다 delete
그들기 전에 수동으로 컨테이너가 파괴되었다.당신은 절대적으로 고려한 스마트 포인터를 사용하는 이 경우에 등 smart_ptr
에 의해 제공됩 Boost
.
물론이지.
// TestCPP.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <iostream>
#include <vector>
using namespace std;
class c
{
public:
void virtual func() = 0;
};
class sc:public c
{
public:
void func(){cout<<"using func";}
};
int _tmain(int argc, _TCHAR* argv[])
{
sc cobj;
vector<c*> cvect;
cvect.push_back(&cobj);
vector<c*>::iterator citer;
for(citer=cvect.begin();citer<cvect.end();citer++)
{
(*citer)->func();
}
return 0;
}
선언문에 유의하십시오 vector<c*> cvect
그리고 사용 cvect.push_back(&cobj)
.
제공된 코드에서 반복자를 잘못된 방식으로 사용하고 있습니다. 회원에게 액세스하려면 반복자가 가리키고 있습니다. *citer
대신에 citer
홀로.
당신은 창조했습니다 vector<c*>
포인터의 벡터를 위해. 그런 다음 사용하십시오 new
C 객체에 대한 메모리를 할당하고 벡터로 밀어 넣습니다. 또한, 당신이해야한다는 것을 잊지 마십시오 delete
자신과 Vector.clear ()는 C 객체에 할당 된 메모리를 해제하지 않습니다. C를 여기에 포인터의 벡터로 저장해야합니다. 그렇지 않으면 가상 기능에 대한 호출이 작동하지 않습니다.
노력하다 포인터 컨테이너 라이브러리 부스트. 다음과 같이 일반 포인터의 일반 벡터에 비해 몇 가지 장점이 있습니다.
my_container.push_back( 0 ); // throws bad_ptr
ptr_vector<X> pvec;
std::vector<X*> vec;
( *vec.begin() )->foo(); // call X::foo(), a bit clumsy
pvec.begin()->foo(); // no indirection needed