Zeiger auf ein dynamisches array von Zeigern auf Objekte

Karte der Klasse header

class card {

public: 

string rtn_suit() { return suit; }
int rtn_rank()    { return rank; }
void set_suit(string new_suit){ suit = new_suit; }
void set_rank(int new_rank) { rank = new_rank; }

card();
card(string suit, int rank);
card(const card& copyCARD);
~card();

private:
string suit;
int rank;

};

#endif

card.cpp

#include "card.h"
card::card()
{
set_suit("default");
set_rank(0);
}
card::card(string new_suit, int new_rank)
{
//allows for using private class member variables
set_suit(new_suit); //can be anything (string)
set_rank(new_rank); //anticipating simple number ranking (int) 
}

card::~card() {}

Deck header-Klasse

class deck {

public:

static const int default_cap = 52;

void addCard(card *new_card);

deck & operator=(const deck &sourceDECK);

void deckPrint();

//----------------------------------------------------

deck(int init_cap = default_cap);
deck(const deck& sourceDECK);
~deck(){ delete [] decklist ; }


private:
card *decklist;
int used;
int capacity;

};

#endif

deck Klasse

 deck::deck(int init_cap)
 {
card **decklist = new card*[init_cap];

 for(int i=0;i<init_cap;i++)
  {
      decklist[i]=new card;
  }

capacity = init_cap;
used=0;
}

deck::deck(const deck& sourceDECK)
{
card **newDECK;

if (capacity != sourceDECK.capacity)
{

    newDECK = new card*[sourceDECK.capacity];

    for(int i=0;i<sourceDECK.capacity;i++)   {   newDECK[i]=new card();  }

    decklist = /*reinterpret_cast<card*>(*/newDECK/*)*/;

    capacity = sourceDECK.capacity;
}

used = sourceDECK.used;
copy(sourceDECK.decklist, sourceDECK.decklist+ used, decklist);

}
deck& deck::operator= (const deck& sourceDECK)
{
if (this == &sourceDECK)

    return *this;


card ** newDECK;
if (capacity != sourceDECK.capacity)
{
    newDECK = new card*[sourceDECK.capacity];

    for(int i=0;i<sourceDECK.capacity;i++)   {   newDECK[i]=new card();   }
    for (int i=0; i<capacity; i++)           {   delete     &decklist[i];     }
    delete [ ] decklist; 
    decklist = /*reinterpret_cast<card*>(*/newDECK/*)*/;
    capacity = sourceDECK.capacity;
}

//Copy the data from the source array:

used = sourceDECK.used;
copy(sourceDECK.decklist, sourceDECK.decklist + used, decklist);

return *this;
}


void deck::addCard(card* new_card)
{
//------- Not using vectors----
//deckList.push_back(new_card);
//cout << "Card added."<<endl;

decklist[used] = new_card;

//decklist[used].set_rank(new_card->rtn_rank());

//decklist[used].set_suit(new_card->rtn_suit());

++used;

cout << "Card added."<<endl;
  }

void deck::deckPrint()
 {
if ( capacity > 0 ) 
{
for(int i = 0; i < capacity; i++)
             {
               cout << "----------"<<endl;
               cout << decklist[i].rtn_rank() << " ";
               cout << decklist[i].rtn_suit() << endl;
               cout << "----------"<<endl;
             }
}
else\
{
    cout << "There are no cards in the deck."<<endl;
}
 }

Und schließlich eine main () -

int main ()
{
string new_suit, del_suit;
int new_rank, del_rank;

deck newDeck;

card *temp_card;


            cout<<"Enter the card's suit: ";
            cin>>new_suit;
            cout<<endl<<"Enter the card's rank: ";
            cin>>new_rank;

            cin.clear();
            cin.ignore(1000, '\n');


        temp_card = new card(new_suit, new_rank);

        newDeck.addCard(temp_card);


        newDeck.deckPrint();


return 0;

}

Irgendwo, irgendwie bin ich nicht der Initialisierung oder Zuweisung richtig. Oder vielleicht habe ich geschraubt bis die Zeiger....

Da ist, wird nicht kompiliert, wegen:

error C2679: binärer '=' : kein operator gefunden, die einen rechten Operanden vom Typ 'Karte *" (oder es gibt keine akzeptable Konvertierung)
\Projekte\Karten\cards\card.h(27): 'könnte Karte &Karten::operator =(const Karte &)", während der versucht, die argument-Liste " (Karte, Karte *)'

Wenn ich (momentan auskommentiert) eine 'tiefere kopieren' aka:

decklist[used].set_rank(new_card->rtn_rnk());

er löst den Fehler in deckPrint()

Ursprünglich schrieb ich diese mit Vektoren für eine einfache Karte, Klasse Umsetzung-und dann haben wir begonnen, das lernen über dynamische arrays - und ich bekam die geniale Idee zu versuchen, und werfen Zeiger in den mix. Wieder, dies ist keine Hausaufgaben - das ist für die persönliche Entwicklung.

Wenn es ein tutorial gibt, habe ich verpasst, die eindeutig beschreibt, was ich versuche zu tun, fühlen Sie sich frei, um mich in diese Richtung auch - ich habe gegossen, die über die top 30 google-Ergebnisse und jede Menge Beiträge hier. Die Hälfte der Zeit, die Menschen empfehlen die Verwendung von Vektoren, die wiederum ist nicht mein Ziel.

Vielen Dank für Ihre Zeit, ich weiß, es ist langwierig.

Bitte machen Sie einen Mindestgröße Beispiel zu Fragen, Ihre Frage. Es ist unwahrscheinlich, dass Menschen die Zeit nehmen, zu Lesen, dass code, um zu versuchen, um Ihnen zu helfen.
Überprüfen Sie Ihre deck copy-Konstruktor/Zuweisungsoperator. Zuweisung von Arrays zu Zeigern, aber nicht zuordnen eigentlichen Objekte für diese Hinweise. Vergleichen Sie es mit deck Konstruktor (macht beides). Zuweisungsoperator, auch, löscht array von Zeigern löschen, ohne die zugrunde liegenden Objekte...
Carl - ich ausgeschnitten alles Fett.
AzzA - ich beheben diese, Dank - habe ich nicht bekommen um zu meinem Bereinigung noch. Sind meine Fragen in der Kopie-cstr/assignment-op ? Ich dachte, Sie waren woanders...
Es ist schade das du gelöscht, Ihre copy-Konstruktor und Zuweisungs-operator - Sie waren die Quelle des Fehlers. Wenn ich mich Recht erinnere, nach der Sie zugeordnet array von card * Zeiger, die Sie versuchen zu kopieren Objekte card hinein. Das ist, warum Sie immer waren binary '=' : no operator found which takes a right-hand operand of type 'card *'... Folgen der Logik Ihrer deck Konstruktor: allocate array von Zeigern mit new, dann für jeden Zeiger in einer Schleife erstellen Objekt mit einem anderen new. Löschen Sie in umgekehrter Reihenfolge - Objekte löschen in der Schleife, dann array von Zeigern.

InformationsquelleAutor mate0x | 2012-02-18

Schreibe einen Kommentar