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.
Ü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
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich denke du hast einen kleinen Fehler in deinem deck Klasse Bauart Funktion.
hier-Karte **Deckliste ist ein neuer Zeiger auf Zeiger, ich denke, Sie wollen initialisiert die privaten Variablen Deckliste.
so können Sie es ändern, um
Deckliste hier ist die private variable.
und ändern Sie die Deklaration
InformationsquelleAutor TecToN