2013-10-08 4 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

Я хотел спросить, будете ли вы считаете, что хороший дизайн класса?

Нет, потому что вы не должны связан список для реализации стеки, потому что вы не бросать исключения, потому что вы не используете существующие решения (такие как 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?

Надежда это помогает :)

Редактировать: Другой подход заключается в том, чтобы реализовать его как плоскую структуру класса и не вставлять классы. Это имеет некоторые преимущества, такие как возможность форвардных объявлений, которые могут быть полезны для более сложных структур.

Смежные вопросы