类类型中的访问器函数未从 C++ 中的私有数据返回正确的值

accessor function in class type not returning proper values from private data in c++

本文关键字:数据 返回 访问 类型 函数 C++      更新时间:2023-10-16

我目前有一个与扑克相关的comp sci项目。我有一个名为 Card 的类,我的构造函数工作正常,但我不确定在尝试打印卡片详细信息时我是否正确访问了我的私人数据。

卡片存储为typedef enum (Invalid, Diamonds, Clubs... ) cSuit

构造函数将数据输入私有数据变量cSuit m_suit;

我有 3 个成员函数 1 是Card::cSuit Card::suit(返回西装)

Card::cPoints Card::points(返回卡的点)和Void Card::print(可以很好地打印卡片)

当我打印出卡片时,它们都显示为无效。我在整个代码中使用了cout来查看问题所在,我认为在我的打印函数中,任何建议都值得赞赏。

#include <iostream>
#include "card.h"
using namespace std ;

// Default constructor marks card as invalid // 
Card::Card() {    m_suit = Invalid ;    m_points = 0 ; }

Card::Card(cSuit s, cPoints p) {
  // your code goes here   
if (s >=1 && s <=4){
    m_suit = s ;   }   else {
    m_suit = Invalid;
    m_points = 0;   }   if (p >=2 && p <=14){
    m_points = p;   }   else {
    m_points = 0 ;
    m_suit = Invalid;   } }

Card::cPoints Card::points() {
  // your code goes here   
cPoints cardPoints;   cardPoints = m_points;    return cardPoints; }
Card::cSuit Card::suit() {
  // your code goes here  

cSuit cardSuit;   cardSuit = m_suit;   return cardSuit; }

void Card::print() {
  // your code goes here  
 Card cardPoint;   Card cardSuits;
  if (cardPoint.points() >=2 && cardPoint.points() <= 10){
    cout << cardPoint.points() << " of " << cardSuits.suit() << endl;   }   if (cardPoint.points() == 11){ 
    cout << "Jack of " << cardSuits.suit() << endl;   }   if (cardPoint.points() == 12){
    cout << "Queen of " << cardSuits.suit() << endl;   }   if (cardPoint.points() == 13){
    cout << "Kind of " << cardSuits.suit() << endl;   }   if (cardPoint.points() == 14) {
    cout << "Ace of " << cardSuits.suit() << endl;}   else {
    cout << "Invalid card" << endl; } }

打印我的卡片的正确方法是什么。

如果我没有正确地提出我的问题,请给我提示,因为不幸的是,我上次问我的问题没有得到很好的接受。

在打印方法的开头,声明两个变量,cardPoint 和 cardSuits,稍后用于打印信息。问题是,您使用默认构造函数创建它们,并且它们与要调用 print() 的卡没有任何关系。如果不看到卡片类的其余部分,我就无能为力,所以如果您需要更多解释,则必须发布整个类代码。

>cardSuitscardPoints是默认初始化的本地对象,因此仅存在于函数中。

您想要访问实际成员。您可以通过编写this->(name_of_member)来执行此操作。此成员可以是公共的、受保护的或私有的,没关系。这个成员可以是成员函数(this->function())或数据成员(this->data)。编写this->是可选的,但会明确您的意图。

所以在任何地方,你写cardPoint.(...)cardSuit.(...),试着写this->(...)

现在我看到了更多的代码,我可以说更多。要打印卡片,您应该从 print() 函数中删除Card cardPoint;Card cardSuits;,只需使用 m_suitm_points ,print() 方法对它们是私有的没有问题,因为它是一个成员函数。我的意思是,只要写cout << m_points << " of " << m_suit << endl;它就会起作用。

我还看到了 Card::Card(cSuit s, cPoints p) 构造函数中可能存在的错误 - 想想当你用 s == 无效和 p == 2 调用它时会发生什么。另外,Card::cPoints Card::points()功能不必要地复杂 - 您可以return m_points; .

而且你应该真正学会格式化你的代码......

编辑:我看到它总是打印"无效卡"的另一个原因 - 在打印功能中,您使用多个if语句,您应该在其中使用else if

if (m_points >=2 && m_points <= 10){...}
else if (m_points == 11){...}
else if (m_points == 12){...}
else if (m_points == 13){...}
else if (m_points == 14) {...}
else { cout << "Invalid card" << endl; }

在你的版本中,没有else if ',它只是一个接一个地执行if语句,最后它达到 if(m_points == 14) ,在大多数情况下 whish 是假的,所以它会转到else语句,并打印"无效卡"