Criar Template de List (C++)

5 respostas
Nicolas_Fernandes

Falae, galerinha do GUJ!
Beleza?

Bom, tô com uma dúvida aqui…
Tô querendo fazer um template pra manipular Listas, mas tá dando uns erros :S
Vejam só o código:

template<class T>
class List {

   private:
   
       Node * firstNode;
       Node * lastNode;        
       int listSize;
      
   public:
   
      List() {
             
        //Faz uns códigos.
      
         listSize = 0;
     }
   
      ~List() {
      
         delete(firstNode);
         listSize = -1;
      }
   
      void Add(T item) {

         this->lastNode = new Node();
         this->lastNode->nodeItem = item;
         this->firstNode->pAnt->pProx = this->lastNode;
         this->lastNode->pAnt = this->firstNode->pAnt;
         this->firstNode->pAnt = this->lastNode;

         this->listSize++;
      } 

      protected:

         struct NODE {
            Node * pAnt;
            T item;
            Node * pProx;
        }Node;
}

Ocorrem o seguinte erro, principalmente:

ISO C++ forbids declaration of `Node’ with no type

Vocês sabem o que pode ser?
Há algo de errado nesse código?

Agradeço desde já, e fico no aguardo ^^/

5 Respostas

E

Tem sim.

Dica: evite usar “struct”, mesmo que você só tenha membros públicos. É que em C++, “struct” é exatamente a mesma coisa que “class”, mas a visibilidade default dos membros é “public”.

Evite também usar typedef. Use typedef apenas e tão somente para criar sinônimos de tipos complicados (como map<string, int>::const_iterator ou coisas mais complicadas).

Dê uma olhada no seu código, e veja como ficou.

#include <iostream>
#include <string>
using namespace std;

template<class T>  
class List {  
protected:
    class Node {
    public:
        Node * pAnt;  
        T item;  
        Node * pProx;
    public: // não se esqueça de definir um construtor para Node, isto vai salvar sua vida
        Node() : pAnt (0), pProx (0) {}
    };

private:  
    Node * firstNode;  
    Node * lastNode;          
    int listSize;  
    
public:  
    List() {  
        //Faz uns códigos.  
        
        listSize = 0;  
    }  
    
    ~List() {  
        delete(firstNode);  
        listSize = -1;  
    }  
    
    void Add(T item) {  
        this->lastNode = new Node();  
        this->lastNode->item = item;   // o original tinha "nodeItem" que não está definido em Node
        this->firstNode->pAnt->pProx = this->lastNode;  
        this->lastNode->pAnt = this->firstNode->pAnt;  
        this->firstNode->pAnt = this->lastNode;  

        this->listSize++;  
    }   
};

class Customer {
public:
    string name;
    double income;
public:
    Customer () {}
    Customer (string name_, double income_) : name(name_), income(income_) { }
    Customer (const Customer& other) : name(other.name), income(other.income) { }
    Customer& operator = (const Customer& other) {
        name = other.name; income = other.income; return *this;
    }
    string toString() { return name; }
};

int main (int argc, char*argv[]) 
{
    List<Customer> customers;
    customers.Add (Customer ("Abdias", 100));
    customers.Add (Customer ("Moises", 200));
    return 0;
}
Nicolas_Fernandes

Enantiomero,

Cara, muito obrigado!
Funcionou perfeitamente!

Agora, eu tenho outra dúvida…

Você conhece o uso de Properties de .NET?

Por exemplo:

private String myVariable;
public String Variable
{
   get { return myVariable; }
   set  { this.myVariable = value; }
}

Há algum meio de fazer isso em C++?

E

A resposta simples é “não”.

Para mais detalhes, olhe a documentação do seu compilador, que deve indicar que versão do C++ ele implementou, e quais recursos estão disponíveis. Mas properties não existem, mesmo na próxima versão do C++ (conhecida por “C++0X”).

Para não dizer que não existem properties em linguagens derivadas do C++, você pode estudar C++/CLR (uma linguagem da Microsoft que é derivada do C++ mas é feita para gerar bytecodes do .NET), que tem properties. Mas a C++ mesmo não tem properties.

Nicolas_Fernandes

Entendi.

Agora, uma dúvida meio boba!

Tenho uma classe Mãe e uma Filha.
Se eu quero acessar membros protegidos da Mãe por intermédio da Filha, eu deveria fazer:

class Filha : protected Mae {
//...
}

Ou poderia simplesmente colocar:

class Filha : public Mae {
//...
}

??

Desde já, agradecido!

E

A menos que você saiba o que está fazendo, sempre use a herança pública:

class X : public Y {
};

A herança privada ou “protected” só deve ser usada em casos especiais, e usar um membro protegido não é um desses casos especiais.

Criado 2 de setembro de 2009
Ultima resposta 2 de set. de 2009
Respostas 5
Participantes 2