2012-06-22 2 views
0

여름 방학 수업을 위해 숙제를하고 있으며 두 개의 수업을 작성해야합니다. 하나는 Sale이고 다른 하나는 Register입니다. 내 Sale 클래스를 작성했습니다. 우리는 회원들의 데이터 Sale 객체의 동적 배열을 포함하는 데 필요한 Register 클래스동적 배열 및 클래스 상속

enum ItemType {BOOK, DVD, SOFTWARE, CREDIT}; 

class Sale 
{ 
public: 
    Sale();   // default constructor, 
      // sets numerical member data to 0 

    void MakeSale(ItemType x, double amt); 

    ItemType Item();  // Returns the type of item in the sale 
    double Price();  // Returns the price of the sale 
    double Tax();  // Returns the amount of tax on the sale 
    double Total();  // Returns the total price of the sale 
    void Display();  // outputs sale info 

private: 
    double price; // price of item or amount of credit 
    double tax;  // amount of sales tax 
    double total; // final price once tax is added in. 
    ItemType item; // transaction type 
}; 

: 여기에 .h 파일입니다.

그래서 내 두 가지 질문은 다음과 같습니다

  • 내가 (만일 그렇다면, 어떻게) 내 Register 클래스로 내 Sale 클래스에서 상속해야합니까?
  • 동적 배열의 일반적인 예가있을 수 있습니까?

편집 : 벡터를 사용할 수 없습니다.

+0

어떤 종류의 판매를 등록 하시겠습니까? 판매가 일종의 등기입니까? 둘 다에 아니오이면, 그들 사이의 상속이 필요 없습니다. –

+0

상속 할 필요가없는 경우 내 등록 클래스에서 판매 개체를 어떻게 사용합니까? –

+0

'Register'는 ** 'Sale' 객체가 ** ** Sale 객체가 아니어야합니다 **. 작곡/집성은 당신이 원하는 것입니다. 'Sale' 객체의 동적 할당을 관리하지만 코스가 레이아웃하는 요구 사항을 충족시키는'std :: vector' 나'std :: list'와 같은 것을 구현하십시오. – tmpearce

답변

2

아니요, 상속은이 경우 적절하지 않습니다. Register 클래스의 필드로 판매 수와 배열 크기를 추적하고 싶을 것입니다. 클래스 정의는

class Register{ 
    private: 
     int numSales; 
     int arraySize; 
     Sale* sales; 
    public: 
     Register(); 
     ~Register(); 
     void MakeSale(Sale);   
}; 

Register::Register(){ 
    numSales = 0; 
    arraySize = 5; 
    sales = new Sale[arraySize]; 
} 
void Register::MakeSale(Sale s){ 
    if(numSales == arraySize){ 
     arraySize += 5; 
     Sale * tempArray = new Sale[arraySize]; 
     memcpy(tempArray, sales, numSales * sizeof(Sale)); 
     delete [] sales; 
     sales = tempArray; 
    } 
    sales[numSales] = s; 
    ++numSales; 
} 

Register::~Register() 
{ 
    delete [] sales; 
} 

이 당신이 판매를 할 때해야 할 체크 경계 또는 어떤 다른 물건을 포함하지 않는 포함 할 것이다, 그러나 희망이 도움이 될 것입니다.

+0

감사합니다. 이것은 많은 도움이됩니다. –

3

상속이 필요하지 않습니다. 일반적인 예 :

std::vector<Sale> sales; 

멋진 템플릿이 있어야합니다.

+0

벡터는 일종의 동적 배열과 같습니다. 맞습니까? –

+0

등급 제한이 없으면 벡터를 사용하는 것이 좋겠지 만 작성해야하는 동적 배열에 대해 이렇게 말합니다. "판매 목록에는 크기 제한이 없으므로 동적으로 할당 된 배열로 구현해야합니다 (즉, 판매 객체의 배열이 필요합니다.)이 배열에는 사용되지 않는 슬롯이 5 개 이상 있어서는 안됩니다 (즉, 할당 된 공간의 수는 실제 슬롯 수인 슬롯 수보다 5 개 더 많을 수 있습니다. 실제 데이터로 채워짐). " 이것이 벡터 사용에 적합한가? –

+0

std :: vector는 동적 배열을 환상적으로 구현 한 것입니다. 당신이 그것을 사용할 수 없다면, 그것이 가지고있는 행동과 그 배후에있는 원리들을 살펴보십시오. 그러나 아니, <= 5 사용되지 않는 부분은 std :: vector가 자동으로 수행하는 것이 아닙니다. – tmpearce

0

벡터를 사용할 수없는 경우 std::list을 사용할 수 있습니다. 가능한 한 표준 컨테이너를 사용해야합니다. 홈 압연 솔루션이 열등 할 가능성이 있습니다. 표준 라이브러리는 광범위하게 최적화되고 테스트되었습니다. 휠을 다시 발명하는 것보다 더 나은 일을 할 때 동일한 투자를 할 필요가 있다고 느끼십니까?

std::list은 필요한 것보다 많은 공간을 할당하면 안됩니다. 그러나 몇 가지 심각한 한계가 있습니다. 벡터 및 다른 형태의 동적 배열이 연속적이라는 사실은 큰 성능 이점을 제공합니다.

벡터를 사용할 수 없다는 것은 매우 제한적인 것처럼 보입니다. 그들이 필요한 것보다 더 많은 공간을 할당한다는 사실은 버그가 아니라 기능입니다. 컨테이너가 고가의 사본을 상각하거나 재 할당과 관련된 작업을 이동하게합니다. 지능형 벡터 구현은 메모리 부족 상황을 확인하고 적절하게 처리해야합니다. 그렇지 않다면 표준 라이브러리 구현에 패치를 제출하거나 새로운 라이브러리로 옮겨야합니다. 그러나, 아니 설명과 함께 임의의 제약 조건을 부과 예 :

이 배열에 5 개 이상 사용하지 않는 슬롯가 전혀 없습니다 (할당 된 공간의 수 있습니다 슬롯의 수보다 최대 5 클 수 있습니다 즉, 실제로 실제 데이터로 채워짐).

은 좋지 않습니다. 그리고 다섯 번째 숫자는 어디에서 왔습니까? 2의 힘이 아닙니다! std::vector::reserve을 사용하여이 제한을 해킹하고 싶다면 이것이 최선의 방법 일 것입니다. 그러나 모든 저서 보관은 할 필요가 없습니다.

그리고 다른 사람들과 합의했습니다. 상속은 당신이 원하는 것이 아닙니다.

+0

이것은 과제물입니다. 그는 인터넷에있는 누군가 나쁜 행동이라고 말했기 때문에 사양에 따라 그렇게 할 수 없습니다. 아마도 선생님은 일을 단순하게 만들고 싶었을뿐 아니라 학생들이 동적 인 크기의 배열을 구현하여 작동 원리를 이해하게 만들었을 것입니다. – Daniel

+0

선생님은 일을 더 복잡하게 만들고 있습니다. 나는 그가 스펙에 따라 그것을해야한다는 것을 이해한다, 나는 단지 교사가 그가하기를 바라는 것을 99 %의 실제 코드에서 소홀히한다는 것을 알리려고 노력하고있다. –

+0

사실, 프로그래밍 클래스의 99 %에서 학생들은 벡터에 대해 배우기 전에 먼저 이렇게해야 할뿐 아니라 벡터가하는 일에 대한 일반적인 아이디어를 이해하게됩니다. – Daniel