重载运算符<<不起作用
overloading operator<< not working
Im在使用重载运算符输出Card对象的数据成员时遇到问题<lt;
我收到一个错误,上面写着
"JS::运算符<<(std::__1::basic_stream>&,JS::Card const&)",引用自:链接器命令失败,退出代码为1(使用-v查看调用)
//
//主要.cpp
#include "Card.h"
#include "Deck.h"
#include <iostream>
using std::cout;
using namespace JasonSteindorf;
int main(int argc, const char * argv[]) {
//Deck d;
//d.shuffle();
Card c(5,3); //5 of Clubs
Card c2; //Ace of Diamonds
cout << c; //not working ???????? should says 5 of Clubs
c.displayCard(); //works
return 0;
}
//
//甲板.h
#ifndef JS_DECK_H
#define JS_DECK_H
#include <iostream>
using std::cout;
#include <vector>
using std::vector;
namespace JS {
//forward declaration
class Card;
class Deck {
public:
Deck();
void shuffle();
private:
vector<Card>cards;
};
}
#endif
//
//Deck.cpp
#include "Deck.h"
#include "Card.h"
#include <algorithm>
using std::random_shuffle;
#include <iostream>
using std::cout;
using namespace JS;
Deck::Deck() {
cout << "A DECK OF CARDS!!!nn";
for(int suit = 0; suit < 4; suit++) {
for(int rank = 1; rank < 14; rank++) {
cards.push_back(Card(rank, suit));
}
cout << 'n';
}
}
void
Deck::shuffle() {
random_shuffle(cards.begin(), cards.end());
//for(int s = 0; s < 52; s++)
// cards.at(s)->displayCard();
for(vector<Card>::iterator it = cards.begin(); it < cards.end(); it++) {
Card a = *it;
a.displayCard();
}
}
//
//卡片.h
#ifndef JS_CARD_H
#define JS_CARD_H
#include <iostream>
using std::ostream;
#include <string>
using std::string;
#include <vector>
using std::vector;
namespace JS {
class Card {
public:
enum Suit { DIAMONDS, HEARTS, SPADES, CLUBS };
enum Rank { ACE = 1, JACK = 11, QUEEN = 12, KING = 13 };
Card();
Card(int rank, int suit);
string getRank() const;
string getSuit() const;
int getRankValue() const;
int operator+(const Card& rhs);
void displayCard() const;
private:
int rank;
int suit;
};
//ostream &operator<<(ostream &out, const Card &rhs);
ostream& operator << (ostream& out, const Card& c);
}
#endif
//
//Card.cpp
#include "Card.h"
#include <iomanip>
using std::setw;
using std::right;
#include <iostream>
using std::cout;
#include <sstream>
using std::stringstream;
using namespace JS;
Card::Card(): rank(1), suit(0){
displayCard();
}
Card::Card(int rank, int suit) : rank(rank), suit(suit) {
displayCard();
}
string
Card::getSuit() const {
switch (suit) {
case SPADES: return "Spades"; break;
case HEARTS: return "Hearts"; break;
case DIAMONDS: return "Diamonds"; break;
case CLUBS: return "Clubs"; break;
default: return ""; break;
}
}
string
Card::getRank() const {
switch (rank) {
case ACE: return "Ace"; break;
case JACK: return "Jack"; break;
case QUEEN: return "Queen"; break;
case KING: return "King"; break;
default:
stringstream out;
out << rank;
return out.str();
break;
}
}
int
Card::getRankValue() const {
switch (rank) {
case ACE: return 1; break;
case JACK:
case QUEEN:
case KING: return 10; break;
default: return rank; break;
}
}
int
Card::operator+(const Card& rhs) {
return (getRankValue() + rhs.getRankValue());
}
ostream& operator <<(ostream& out, const Card& c)
{
out << c.getRank() << " of " << c.getSuit();
return out;
}
/*ostream
&operator<<(ostream &out, const Card &rhs) {
out << rhs.getRank() << " of " << rhs.getSuit();
return out;
}*/
void
Card::displayCard() const {
cout << right << setw(5) << getRank()
<< setw(3) << " of "
<< getSuit() << 'n';
}
Card.h
在命名空间中声明运算符:
namespace JS {
ostream& operator << (ostream& out, const Card& c);
}
但是Card.cpp
在全局名称空间中定义了一个不同的运算符:
ostream& operator <<(ostream& out, const Card& c) {...}
您的选择是:
- 将声明放入全局命名空间中;或
- 将定义放入
JS
命名空间中;或 - 在定义中将名称限定为
JS::operator<<
相关文章:
- 我的神经网络不起作用 [XOR 问题]
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- C++为什么尽管我调用了void函数,它却不起作用
- 为什么在保护模式下继承升级不起作用
- 循环在计数器中不起作用
- 在其他文件中创建类时在 c++ 项目中不起作用
- Visual studio代码重构似乎不起作用(例如,重命名符号-f2)
- 为什么二进制搜索在我的测试中不起作用
- 我的代码中有错误吗?使用BGI图形的C++代码对我不起作用
- 为什么 const std::p air<K,V>& 在 std::map 上基于范围的 for 循环不起作用?
- 带有指定长度字符* 参数的 std::regex_search 在 VS2017 中不起作用?
- Bjarne Stroustrup Book - std_lib_facilities.h - 不起作用(未知类型名称)
- 为什么简单的算术减法在"if"条件下不起作用?
- 为什么Stroustup书中的has_f不起作用
- 你能检查一下为什么在这个代码中从链接列表中删除项目不起作用吗
- 嵌套While循环不起作用(C++问题)
- C++Matching Brackets 2解决方案不起作用
- 为什么COUT在朋友函数中不起作用,该功能超载了操作员&lt;&lt;这是一个iStream运算符
- 我已经完成了<<运算符重载,但它'It’不起作用