gpt4 book ai didi

C++ 模板和类

转载 作者:行者123 更新时间:2023-11-28 00:54:34 25 4
gpt4 key购买 nike

作为学习练习,我想对不同文件中不同类型的数字进行排序。我已经设法让 double 和整数正确排序,但无法让我自己的类型(对一副牌排序)正确格式化。我设法将它缩小到我的Reader 类中的排序函数。我遇到了各种各样的错误。我到底做错了什么?或者我错过了什么?谢谢大家,我希望我能把我的问题解释清楚。

我为卡片创建的文件看起来像...

1 11 (meaning Jack of Diamonds)

2 8 (meaning 8 of hearts)

等...

错误:

error: no match for 'operator<' in '((Reader)this)->Reader::array[compareIndex] < ((Reader)this)->Reader::array[smallestIndex]'

error: cannot convert 'Card' to 'int' in initialization

error: no match for 'operator=' in '((Reader*)this)->Reader::array[smallestIndex] = temp'

我的代码

最后,主要

#include <iostream>
#include "Reader.h"
#include "Card.h"

using namespace std;


int main() {

Reader<int> nums;
Reader<double> dubs;
Reader<Card> cards;
int number;

do {

cout << "Enter 1 if your file contains integers\n"
<< "Enter 2 if your file contains doubles\n"
<< "Enter 3 if your file contains Cards:\n"
<< "Enter a number: ";
cin >> number;

if (number == 1){
nums.open_IO();
nums.read_array();
nums.sort();
nums.write_array();
nums.close_IO();
} else if (number == 2){
dubs.open_IO();
dubs.read_array();
dubs.sort();
dubs.write_array();
dubs.close_IO();
} else if (number == 3){
cards.open_IO();
cards.read_array();
cards.sort();
cards.write_array();
cards.close_IO();
}

} while ((number != 1) && (number != 2) && (number != 3));


}

Reader.h

#ifndef READER_H
#define READER_H
#include <string>
#include <fstream>
using namespace std;

template <class rList>
class Reader {
public:
static const int SIZE = 50;

Reader();

bool open_IO();

void close_IO();

bool read_array();

bool write_array();

void sort();


private:
// Ask for the files
void ask_filenames();

rList array[SIZE];
int readSize;

// input file names and stream to get the data
string readFileName;
ifstream inFile;

// output file names and stream to get the data
string writeFileName;
ofstream outFile;
bool askedFileNames;
};

#endif

#include "Reader.cpp"

我的Reader.Cpp文件

// File: Reader.cpp
#ifndef READER_CPP
#define READER_CPP
#include "Reader.h"
#include <iostream>
using namespace std;

/***************************************************************************
* Contructors and modifying functions defined in "Reader.h"
***************************************************************************/


template <class rList>
Reader<rList>::Reader() {
askedFileNames = false;
readFileName = "";
writeFileName = "";
readSize = 0;
rList empty;
for( int i = 0; i<SIZE; i++ ) array[i]=empty;
}

template <class rList>
bool Reader<rList>::open_IO(){
if(!askedFileNames) ask_filenames();

inFile.open(readFileName.c_str()); //we can't pass a string, we need a char array
if(!inFile.is_open()) {
return false;
}
outFile.open(writeFileName.c_str());
if(!outFile.is_open()) {
inFile.close(); //inFile opened successfully so it needs to be closed now
return false;
}
return true;
}

template <class rList>
void Reader<rList>::close_IO() {
inFile.close();
outFile.close();
}

template <class rList>
bool Reader<rList>::read_array() {
if(inFile.is_open()) {
inFile >> readSize;
int index = 0;
while(!inFile.eof() && index < readSize) {
inFile >> array[index++]; //increments index after assigning value
}
readSize = index; //the input file could have had fewer numbers so set readSize
return true;
}
return false;
}

template <class rList>
bool Reader<rList>::write_array() {
if(outFile.is_open()) {
outFile << readSize << endl;
//don't forget the number indicating the element co
int index = 0;
while(index < readSize) {
outFile << array[index++] << endl;
}
return true;
}
return false;
}

template <class rList>
void Reader<rList>::sort() {
int startIndex = 0;
int compareIndex;
int smallestIndex;
bool smallerFound;
while(startIndex < readSize) {
smallestIndex = startIndex;
compareIndex = startIndex + 1;
smallerFound = false;
while(compareIndex < readSize) { //find the smallest value from the starting index
if(array[compareIndex] < array[smallestIndex]) {
smallestIndex = compareIndex;
smallerFound = true;
}
compareIndex++;
}
if(smallerFound) { //only swap the values if a smaller value is found
int temp = array[startIndex];
array[startIndex] = array[smallestIndex];
array[smallestIndex] = temp;
}
startIndex++;
}
}

/*--------------------------------------------------------------
This function asks the user for the filenames. This operation
is placed in a separate function because it is called multiple
times.
--------------------------------------------------------------*/
template <class rList>
void Reader<rList>::ask_filenames() {
cout << "Welcome. Please type in the name of the file to read the numbers.\n";
cin >> readFileName;
cout << "Thank you. Please type in the name of the file to write the numbers.\n";
cin >> writeFileName;
askedFileNames = true;
}

#endif

卡片.h

#include <ostream>
#include <string>
#include "Reader.h"

using namespace std;

class Card{
public:
static const int SIZE = 50;
enum SUIT {clubs, diams, hears, spads };
enum RANK {ace=1, two, thr, fou, fiv, six, sev, eig, nin, ten, jac, que, kin};

Card();

Card(int newSuit, int newRank);

void change(int newSuit, int newRank);

friend ostream& operator << ( ostream& out, Card theCard );
friend istream& operator >> ( istream& in, Card theCard );

private:
void change_rank(int newRank);

void change_suit(int newSuit);

string get_rank() const;

string get_suit() const;

SUIT suit;
RANK rank;


};

卡片.cpp

    #include <iostream>
#include <string>
#include "Card.h"

using namespace std;

Card::Card() { suit = spads; rank = ace; }

Card::Card(int newSuit, int newRank) {
change(newSuit, newRank);
}

void Card::change( int newSuit, int newRank ) {
change_suit( newSuit );
change_rank( newRank );
}


ostream& operator << ( ostream& out, Card theCard ) {
out << theCard.get_rank() << " of " << theCard.get_suit();
return out;
}

istream& operator >> ( istream& in, Card theCard ) {
int aSuit;
int aRank;

in >> aSuit >> aRank;
return in;
}


// private member functions to set the private variables with their
// corresponding values: integer input -> enumerated type;
void Card::change_rank( int newRank ) {
if( newRank == ace ) rank = ace;
else if( newRank == two ) rank = two;
else if( newRank == thr ) rank = thr;
else if( newRank == fou ) rank = fou;
else if( newRank == fiv ) rank = fiv;
else if( newRank == six ) rank = six;
else if( newRank == sev ) rank = sev;
else if( newRank == eig ) rank = eig;
else if( newRank == nin ) rank = nin;
else if( newRank == ten ) rank = ten;
else if( newRank == jac ) rank = jac;
else if( newRank == que ) rank = que;
else if( newRank == kin ) rank = kin;
}

void Card::change_suit( int newSuit ) {
if( newSuit == clubs ) suit = clubs;
else if( newSuit == spads ) suit = spads;
else if( newSuit == diams ) suit = diams;
else if( newSuit == hears ) suit = hears;
}

// Private member functions to extract the information from the card
// class.
string Card::get_rank() const {
if( rank == ace ) return "ace";
if( rank == two ) return "two";
if( rank == thr ) return "three";
if( rank == fou ) return "four";
if( rank == fiv ) return "five";
if( rank == six ) return "six";
if( rank == sev ) return "seven";
if( rank == eig ) return "eight";
if( rank == nin ) return "nine";
if( rank == ten ) return "ten";
if( rank == jac ) return "jack";
if( rank == que ) return "queen";
if( rank == kin ) return "king";
return "get_rank: error";
}

string Card::get_suit() const {
if( suit == diams ) return "D";
if( suit == hears ) return "H";
if( suit == spads ) return "S";
if( suit == clubs ) return "C";
return "get_suit: error";
}

最佳答案

如果您使用 std::vector<Card>而不是 C 数组,你重载了 operator<对于 Card , 你可以获得标准库来为你洗牌和排序。

vector<T>是标准库自带的容器。这是一个可以存储类型元素的类模板 T . T可以是数字类型,std::string甚至是 structclass .

这是为 Card 重载小于运算符的方法:

bool Card::operator<(const Card& other)
{
return true if this card is smaller than the other card;
// You may want to order by rank, then by suit, or vice-versa.
}

定义了这个运算符后,标准库容器和算法现在将“知道”如何订购您的 Cards .

以下是使用 vector 的方法的 Card

std::vector<Card> deck(52); // Initially sized to 52 elements
// Populate deck just like you would an array
deck[0] = Card(diams, ace);
etc...

// Sort the deck
std::sort(deck.begin(), deck.end());

// Shuffle the deck
std::random_shuffle(deck.begin(), deck.end());

// Get the 5th card in the deck
Card fifth = deck[4];

std::sort使用快速排序算法,它比您编写的冒泡排序快得多(无意冒犯:-)。很难编写可以击败标准库提供的手工数据结构和算法。编译器作者花了数年时间来完善和调整他们的标准库实现。

当您使用标准库容器时,您就拥有了一个标准库算法库供您使用。这使您可以专注于解决问题,而不是一遍又一遍地重写相同的基本算法和数据结构。

关于C++ 模板和类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12240273/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com