成员getName的错误请求,非类型类型'char'

时间:2015-02-15 04:03:14

标签: c++ c pointers header

我正在尝试制作一个涉及文件assign2.cppPlayer.hPlayer.cppTeam.hTeam.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

我很困难,提前谢谢。

2 个答案:

答案 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()编辑。在这种情况下,您的默认构造函数可能需要执行相同的操作。

无论哪一个是正确答案,完全取决于您的要求,您必须自己弄明白。