문제

지 궁금하기 때문에,문제의 실행하고 있으로,그것을 만들 수 벡터의 포인터?고 할 수 있다면,어떻게 해야 하나요?특별히 관를 사용하여 반복기도와.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_ptrs (같은 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
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top