2016-10-25 5 views
-4

다음과 같은 방법으로 클래스의 객체를 만드는 방법의 차이점은 무엇입니까? 헤드 파일은 다음과 같습니다클래스의 객체를 만드는 방법

class NumberRange { 
public: 
    NumberRange(int a, int b); 
    virtual ~NumberRange(); 
    void Print(int a, int b); 
private: 
    int *range_; 
    int size; 
}; 

.CC 파일은 다음과 같습니다

#include <iostream> 
#include "numberrange.h" 
using namespace std; 

NumberRange::NumberRange(int a, int b) { 
    if (a > b) { 
     cout << "a must be equal or less than b" << endl; 
    } 
} 

NumberRange::~NumberRange() { 

} 

void NumberRange::Print(int a, int b) { 
    this->size = b - a + 1; 
    this->range_[0] = a; 
    for (int i = 0; i < this->size; i++) { 
     this->range_[i] = a + i; 
     cout << this->range_[i] << endl; 
    } 
} 

int main() { 
    NumberRange * numberrange = new NumberRange(5, 9); 
    numberrange->Print(5, 9); 
} 

내가 포인터를 사용하여 객체를 생성하고 프로그램을 컴파일합니다. 나는 오류가 [1] 20346 segmentation fault ./numberrange

말한다 있어요하지만 같은 주요 기능을 변경하는 경우 :

int main() { 
    NumberRange numberrange(5,9); 
    numberrange.Print(5,9); 
} 

이 일 것입니다. 그래서 언제 포인터를 사용하여 객체를 만들어야하는지 모릅니다. 고맙습니다!

+0

개체의 필드 중 하나는'int * range_'입니다. 생성자에서 초기화/할당하지 않으므로 Print 함수에서이 속성을 사용하면 정의되지 않은 동작이 발생합니다. 때로는 효과가 있으며 때로는 그렇지 않을 수도 있습니다. 먼저 수정 한 다음 다시 시도하십시오. –

+3

당신은'range_'를 할당하지 않았습니다. 간단합니다. 따라서 정의되지 않은 동작을 호출하고 있습니다. 정의되지 않은 동작은 ... 음 ... 정의되지 않았습니다. –

+0

두 번째 작품은 운이 좋았 기 때문입니다. 'range_' 객체를 저장하지 않고 접근합니다. 이것은 정의되지 않은 동작입니다. – Chad

답변

1

프로그램에 3 가지 문제가 있습니다.

첫 번째, 가장 분명한 문제는 int * range_가 정수에 대한 포인터이지만 특히 아무 것도 가리 키지 않는다는 것입니다. 그냥 임의의 메모리 주소가 포함되어 있습니다. 변경하려면 int로 배열을 지정하십시오. :

range_ = new int [b - a]; 

두 번째, 덜 분명 문제가 먼저 생성자에서 이상 (더 나은 방법을 활용하지, 그런데) 인쇄 방법, 개체에 A와 B 두 번 통과한다는 것입니다. C++에서 ++가 제공하는 것 중 하나는 객체 지향입니다. 객체에는 상태가 있습니다. NumberRange 클래스의 객체에 3에서 7까지의 숫자를 저장하려면 생성자를 사용하여 속성으로 저장합니다. Print 메서드에서 경계를 다시 전달할 필요가 없으므로 속성에서 해당 경계를 읽을 수 있습니다.

세 번째로 덜 명백한 문제는 예제에서 인쇄하려는 숫자가 저장 될 필요가 전혀 없다는 것입니다.

문제 2와 3이 연결되어 있습니다. 아마도 당신은 숫자를 인쇄하는 것보다 더 많은 것을하고 싶을 것입니다. 그래서 생성자 중 하나를 저장 a 및 b, 또는 배열을 할당하고 최대 개까지의 숫자를 저장하십시오. 후자는 덜 효율적이지만 나중에는 인접한 정수가 아닌 시퀀스를 저장하려고합니다.

3

클래스에 range_ 포인터가 있습니다.이 포인터는 생성자에서 초기화하지 않습니다. 그런 다음 두 경우 모두 UB로 연결되는 Print 방법에서 사용합니다. 사실, 프로그램이 두 번째 경우에 충돌하지 않는다고해서 프로그램이 올바른 것은 아닙니다.

관련 문제