2017-12-06 5 views
0

오브젝트를 작성하는 태스크가 있습니다. Stos 오브젝트 힙을 가진 오브젝트 Obiekt이 있으며, 원하는대로 추가 할 수 있습니다.오브젝트 포인터의 벡터가 홀수 값을 반환합니다.

프로그램이 동적 배열을 더 잘 지원할 수 있도록하기 위해 Vector를 사용하기로 결정했습니다. 전체 구현이 완벽하게 실행되는 것 같습니다. 반환 된 값은 완전히 꺼져 있습니다.

class Obiekt { 
private: 
    int id; 

public: 
    Obiekt::Obiekt(int i) { 
     id = i; 
    } 

    void Obiekt::display() { 
     cout << "This object has id of: " << id << endl; 
    } 
}; 

class Stos { 
private: 
    vector < Obiekt* > stos; 
public: 
    Stos::Stos(Obiekt n) { 
     add(n); 
    } 

    void Stos::add(Obiekt n) { 
     stos.push_back(&n); 
    } 

    void Stos::display() { 
     cout << endl << "===HEAP DISPLAY===" << endl; 
     for (int i = 0; i < stos.size(); i++) { 
      stos[i]->display(); 
     } 
    } 
}; 

void Zad1() 
{ 
    Obiekt obj1(5); 
    Obiekt obj2(23); 

    Stos s1(obj1); 
    s1.add(obj2); 
    s1.display(); 

    getchar(); 
} 

그리고 결과의 존재 : 여기서 은 코드 예이다 -858993460

:

=== HEAP 표시 ===

이 객체의 ID를 갖는다 이 개체의 ID : 9805925

저는 아닙니다. cpp 전문가와 문제가 stos.push_back(&n) 부분과 관련되어 있다고 생각하지만 ID가 너무 왜곡되는 순간을 포착 할 수 없습니다.

아마도 멍청한 질문 일 겁니다. 시작했을 때 미안 해요.

도움이 될 것입니다.

+0

일했다! 감사. 답변으로 게시 할 수 있습니까? – aln447

+0

게시 됨 답변 됨 : –

+0

가장 간단한 해결책은 벡터를 벡터로 설정하는 것입니다. < Obiekt > stos; –

답변

1

매개 변수

Stos::Stos(Obiekt n) { 
    add(n); 
} 

void Stos::add(Obiekt n) { 
    stos.push_back(&n); 
} 

Obiekt n는 각 호출 후 immediatly 파괴의 임시 복사본입니다.

대신 포인터 Obiekt * n을 사용하여 참조 Obiekt & n 이상을 사용해야합니다.

+3

매개 변수가 참조에 의해 전달되면 그 주소가 호출 너머에 저장되어서는 안된다는 것이 일반적입니다. 따라서 이것은 좋은 스타일이 아닙니다. –

3

오닐 (O'Neil)이 올바르게 설명한 코드 문제는 Obiekt 개체의 포인터를 추가한다는 것입니다. 그래서 기본적으로 main에 객체를 만들고이를 생성자와 Stos의 .add 함수에 전달합니다. 그런 다음 포인터을 벡터에 추가합니다. 함수가 끝나면 전달 된 복사본이 파괴되고 벡터의 포인터가 매달립니다. 이 문제를 해결하는 방법은 두 가지가 있습니다 참조

에 의해

1 패스 이것은 매우 간단합니다, 기본적으로 당신은 당신의 함수 매개 변수에 앰퍼샌드를 추가. 예를 들어 :

void Stos::add(Obiekt &n) { 
    stos.push_back(&n); 
} 

이 객체가

2 포인터를

에 있습니다 작업에 문제점을 얻는 또 다른 방법을 사용하지 마십시오 함수의 끝에서 파괴되지 않도록한다 포인터를 사용하지 마십시오. 벡터는 실제로 Obiekt 객체의 내용을 복사합니다. 예 :

vector <Obiekt> stos; // notice how we define it without the pointer type 

...

void Stos::add(Obiekt n) { 
    stos.push_back(n); // Creates copy which will then contain the correct value 
} 
+0

작업 요구량은 다음과 같습니다. 배열이 클래스 포인터 유형 – aln447

+0

Gotcha가 될 것입니다. M.M이 맞다. 참조 대신 포인터 값을 전달해야한다. –

0

표시 할 때 개체가 존재한다고 주장하는 것을 꺼려합니다.

문제

GCC의 구현에 따르면 그렇지 않습니다. 범위를 벗어나 즉시 파괴됩니다. "Obiekt에게"이 아닌 사소한 소멸자를주고이 문제가 명확하게 :

~Obiekt(){std::cout << "Bye from: " << it << std::endl;} 

둘째로, 당신은 클래스 자체 내에서 정의 된 함수의 클래스 회원 (지정하지 않아야 있습니다 어떤 class_name에 :: FUNCTION_NAME (매개 변수) 단지 FUNCTION_NAME (매개 변수))의 변화에 ​​

당신은()가 할 수 있습니다

가능한 수정 "Stos"하도록 : 오닐 @

Stos(Obiekt &n) {add(n);} 
void add(Obiekt &n) {stos.push_back(&n);}