2017-11-18 5 views
-2

나는 C++ 객체 지향 프로젝트를 연구 중이다.포인터를 무시할 때 C++ 벡터가 널 포인터를 사용하는 이유는 무엇입니까?

vector<Shape*> list_of_shapes = {}; 

모양이 다른 클래스, 그리고 아래에의 헤더 파일입니다 :

class Shape{ 
private: 
    string color;//private variable 
public: 
    Shape(string c);//non-default constructor 
    string getColor();//returns color of the object 
    virtual void print() = 0;//pure virtual "print" function 
}; 

모양이라는 클래스의 상위 클래스 내 ListOfShapes 클래스의 private 변수로 벡터를 정의 직사각형 : 메인 함수에

class Rectangle:public Shape{ 
public: 
    Rectangle(const string &c,double length,double breadth); 
    void print(); 
private: 
    double length, breadth; 

}; 

는 제가 위에서 언급 한 벡터에 대한 포인터 (Shape 객체를 가리키는)를 가압하는 기능을 포함하는 ListOfShapes 객체를 생성한다. 나도 같은를 만들려고하면

int main() { 
    ListOfShapes* list; 
    Shape* r; 
    r = new Rectangle("red",1,1); 
    list->addShape(r); 
    return 0; 
} 

내 코드는 미세한 컴파일하고 실행합니다 마침내 여기

void ListOfShapes::addShape(Shape* s) { 
    list_of_shapes.push_back(s); 
} 

그리고 메인 함수에서 호출하는 작업입니다 : 여기에 호출 된 함수의 구현입니다 main 함수 안에 vector (Shape에 대한 포인터를 저장). 이 문제는 addShape 메서드 내에서 발생합니다. 벡터 클래스의 push_back 메서드가 호출 될 때 어떤 이유 때문에 null 포인터가 사용됩니다. 나는이 문제를 debbug하려고 노력하는 데 시간을 보냈지 만 그 원인을 찾을 수없는 것 같습니다. 내가 점점 오전 오류 : 당신은 초기화되지 않은 포인터 list에 액세스하는

Debugger output

+2

'list-> addShape (r);'-'list'가 가리키는 곳은 어디입니까? 그리고 단순히'ListOfShapes list; – PaulMcKenzie

+1

* 내 코드가 잘 컴파일되고 실행됩니다. * - "컴파일 중"은 구문 오류가 없음을 의미합니다. 프로그램이 논리적으로 정확한지 여부와 관련이 없습니다. – PaulMcKenzie

+0

고마워, 처음부터 깨달았어야 했어. 문제 해결 – Hamza

답변

1

: 당신이 당신의 디버거 출력을 보면

int main() { 
    ListOfShapes* list; 
    Shape* r; 
    r = new Rectangle("red",1,1); 
    list->addShape(r); // <-- list is not initialized, thus undefined behavior 
    return 0; 
} 

, 당신은 this이의 이상한 값을 갖는 것을 볼 수 addShape 기능. 이는 오브젝트 자체가 유효하지 않으며 유효하지 않은 오브젝트 내에서 수행 된 모든 것도 유효하지 않다는 표시입니다.

list 로컬 개체를 만들기 만하면됩니다.

int main() { 
    ListOfShapes list; 
    Shape* r; 
    r = new Rectangle("red",1,1); 
    list.addShape(r); 
    return 0; 
} 

은 또한 당신의 Shape 클래스는 가상 소멸자를 가져야한다 : 포인터에 대한 필요가 없습니다. list에 저장된 list을 통해 delete에 저장된 개체를 시도하면 Shape에 가상 소멸자가 없기 때문에 프로그램에서 정의되지 않은 동작을 호출합니다.