我正在尝试制作一个涉及文件assign2.cpp
,Player.h
,Player.cpp
,Team.h
,Team.cpp
的程序,该文件从txt文件中读取数据玩家信息(如点击,atBat,位置,姓名和号码)并将其显示在assign2.cpp
中。 assign2.cpp
包含int main()
,并且假设包含的代码非常少,因为依赖其他文件来完成工作。
错误:
request for member getName which is of non-class type ‘char’...
请帮助,我一直试图找到问题而且永远不会这样做。编译失败:
In file included from Team.cpp:1:0:
Team.h:34:11: warning: extra tokens at end of #endif directive [enabled by default]
Team.cpp: In constructor ‘Team::Team()’:
Team.cpp:15:5: warning: unused variable ‘numPlayers’ [-Wunused-variable]
Team.cpp: In member function ‘void Team::sortByName()’:
Team.cpp:49:56: error: request for member ‘getName’ in ‘((Team*)this
-> Team::playerObject[(j + -1)]’, which is of non-class type ‘char’
Team.cpp:49:74: error: request for member ‘getName’ in ‘bucket’, which is of non-class type ‘int’
Team.cpp: In member function ‘void Team::print()’:
Team.cpp:63:18: error: request for member ‘print’ in ‘((Team*)this)- >Team::playerObject[i]’, which is of non-class type ‘char’
make: *** [Team.o] Error 1
Team.h
#ifndef TEAM_H
#define TEAM_H
#include "Player.h"
class Team
{
private:
char playerObject[40];
int numPlayers; // specifies the number of Player objects
// actually stored in the array
void readPlayerData();
void sortByName();
public:
Team();
Team(char*);
void print();
};
#endif / *Team.h* /
Team.cpp
#include "Team.h"
#include <cstring>
#include <iostream>
#include <iomanip>
#include <stdio.h>
#include <string.h>
#include <fstream>
#include <cstdlib>
using namespace std;
Team::Team()
{
strcpy (playerObject,"");
int numPlayers = 0;
}
Team::Team(char* newPlayerObject)
{
strncpy(playerObject, newPlayerObject, 40);
readPlayerData();
}
void Team::readPlayerData()
{
ifstream inFile;
inFile.open("gamestats.txt");
if (!inFile){
cout << "Error, couldn't open file";
exit(1);
}
inFile.read((char*) this, sizeof(Team));
inFile.close();
}
void Team::sortByName()
{
int i, j;
int bucket;
for (i = 1; i < numPlayers; i++)
{
bucket = playerObject[i];
for (j = i; (j > 0) && (strcmp(playerObject[j-1].getName(), bucket.getName()) > 0); j--)
playerObject[j] = playerObject[j-1];
playerObject[j] = bucket;
}
}
Player.h(任何人都需要它)
#ifndef PLAYER_H
#define PLAYER_H
class Player
{
// Data members and method prototypes for the Player class go here
private:
int number;
char name[26];
char position[3];
int hits;
int atBats;
double battingAverage;
public:
Player();
Player(int, char*, char*, int, int);
char* getName();
char* getPosition();
int getNumber();
int getHits();
int getAtBats();
double getBattingAverage();
void print();
void setAtBats(int);
void setHits(int);
};
#endif
我很困难,提前谢谢。
答案 0 :(得分:1)
在此行的Team
构造函数中
playerObject = newPlayerObject;
您尝试将char*
类型的值分配给char[40]
类型的成员,但这种成员不起作用,因为它们是两种不同的类型。在任何情况下,您可能需要从输入中复制数据,而不是仅仅尝试在内部保存指针。像
strncpy(playerObject, newPlayerObject, 40);
通常,您始终可以将char[N]
分配给char*
,但不是相反,但这只是因为C ++会自动转换{{1} } char[N]
,它们仍然是不同的类型。
答案 1 :(得分:0)
您的声明是:
char playerObject[40];
你的构造函数是:
Team::Team(char* newPlayerObject)
{
playerObject = newPlayerObject;
您在此问题的标题中引用的错误消息显然来自此处,并且它是自我解释的。当涉及到这种类型的赋值时,数组和指针是两种完全不同的,不兼容的类型。
您需要做的事情完全取决于您期望发生的事情以及您的规格。
A)你可能试图从字符指针初始化数组,在这种情况下你可能想要使用strcpy()
。当然,您必须确保字符串(包括空字节终结符)不超过40个字节,否则这将是未定义的行为。
很明显,这是你在默认构造函数中所做的:
Team::Team()
{
strcpy (playerObject,"");
}
B)或者,您的playerObject
班级成员可能应该是char *
,而应该被分配,就像那样,或者strdup
()编辑。在这种情况下,您的默认构造函数可能需要执行相同的操作。
无论哪一个是正确答案,完全取决于您的要求,您必须自己弄明白。