2013-10-08 2 views
0

클래스를 배우고 구현하려고하는데 중첩 클래스를 구현할 때이 문제가 발생했습니다. 나는 그것의 버전을 구현했다. 중첩 클래스에 대한 좋은 예라고 생각하는지 묻고 싶습니다. 이 수업을 중첩하지 않고 어떻게 동일한 목적을 달성 할 수 있습니까?좋은 디자인을 만드는 방법?

#include<iostream> 

class Stack { 
    class Node { 
     public: 
      int data; 
      Node* next; 
      Node(int data, Node* next); 
      ~Node(); 
    }* head; 
    public: 
     Stack(); 
     Stack(const Stack& s); 
     void operator=(const Stack& s); 
     ~Stack(); 
     void push(int data); 
     int peek() const; 
     int pop(); 
}; 
+0

먼저 복사하면 수업이 중단됩니다. 당신은 복사 생성자와 대입 연산자가 필요합니다. 다음으로 peek 함수가 const 일 수 있습니다. –

+0

"중첩 클래스 구현 문제"이 문제에 대해 질문하는 것이 더 좋습니다. – SigTerm

+0

@NeilKirk 수업을 어 겼음을 의미합니까? 그리고 생성자가 이미 정의 되었기 때문에 컴파일러가 3의 규칙 때문에 복사 생성자와 대입 연산자를 생성하지 않는다는 것을 확인하기 위해? –

답변

3

나는 당신이 좋은 클래스 디자인이라고 생각인지 물어보고 싶은게?

아니, 당신은 당신이 기존 솔루션 (예 : std::stack, std::vector 또는 std::deque)를 사용하지 않기 때문에 당신이 예외를 발생하지 않기 때문에, 스택을 구현하기 위해 목록을 연결하고, 수업 때문에 필요하지 않기 때문에 rule of three에 복종하지 않습니다.

template<typename Val> class Stack{ 
protected: 
    typedef std::vector<Val> Data; 
    Data data;  
public: 
    const Val& top() const{ 
     if (!data.size()) 
      throw std::underflow_error(); 
     return data[data.size()-1]; 
    } 
    void push(const Val& arg){ 
     data.push_back(arg); 
    } 
    Val pop(){ 
     Val result = top(); 
     data.pop_back(); 
     return result; 
    } 
}; 

중첩 된 클래스를 구현하는이 문제를 해결합니다.

"중첩 된 클래스 연습"링크 된 목록에 더 적합합니다.

어떻게해야합니까? 그것에 대한 내 접근 방식은 무엇이되어야합니까?

가능한 한 작게 쓰고 기존 솔루션을 다시 사용하고 간단하게 유지하십시오.

좋은 책이 있습니까?

디자인 패턴에 대한 책이 있어야하지만 너무 빠를 수도 있습니다. 나는 잠시 동안 연습을 계속하는 것이 바람직하다. 관심있는 진짜 문제를 사용하는 것이 바람직하다.

+0

"기존 솔루션 (예 : std :: stack)을 사용하고 있지 않습니다." 조금 가혹합니다. 학습용으로 새로운 솔루션을 만드는 것이 좋습니다. –

+2

@NeilKirk : 그건 사실입니다. 바퀴를 재발 명하는 것은 좋은 운동이지만 실제로는 좋은 디자인이 아닙니다. – SigTerm

0

개인적으로 중첩 된 클래스가 좋은 디자인 선택이 될 수 있다고 생각하지만 현재 상황에 맞으면 무게를 달아야 할 것이다 상태. 특정 경우에는 중첩 된 클래스로 구현하는 것이 좋습니다. 나는 그것이 중첩 된 클래스는 약간의 기능을 가지고 있으며,이 중첩되어 클래스에 고유 한 것이 중요하다 생각이 스레드에 대한 자세한 설명을 찾습니다

:. Pros and cons of using nested C++ classes and enumerations?

희망이 :)

하는 데 도움이

편집 : 다른 접근 방식은 플랫 클래스 구조로 구현하고 클래스를 중첩하지 않는 것입니다. 이것은보다 복잡한 구조에 유용 할 수있는 forward 선언의 가능성과 같은 몇 가지 장점을 가지고 있습니다.

관련 문제