Getting “Use of undefined type” and “Must have class/struct/union” errors

不羁的心 提交于 2019-12-31 03:53:08

问题


EDIT #1: Everything before editing the line

<< "Owner: " << (*wo._owner).getLoginName() << endl;

worked completely fine, or at least didn't throw errors on me.

So I have the following code (obviously there is a lot more that if requested I will post, just not sure if more is needed or that is ok):

class Workout
{
private:
    int _workoutid; // the ID of this workout
    User* _owner; // Who did this workout
    float _distance; // in miles
    int _duration; // in seconds
    int _day, _month, _year; // date: MM/DD/YYYY
    int _weight; // lb, on the date of workout
    // private methods (if necessary)
public:
    friend std::ostream& operator<< (ostream& out, Workout& wo)
    {
        out << "Workout ID: " << wo._workoutid << endl
            << "Owner: " << (*wo._owner).getLoginName() << endl
            << "Distance: " << wo._distance << endl
            << "Duration: " << wo._duration / 3600 << ":" << (wo._duration % 3600) / 60 << ":" << wo._duration % 60 << endl
            << "Date: " << wo._month << ":" << wo._day << ":" << wo._year << endl
            << "Weight: " << wo._weight << endl;
        return out;
    }
    // Print workout id, owner’s username, distance
    // duration (HH:MM:SS), date (MM:DD:YY) and weight of
    // the workout
    // and other public methods (mutators/setters, accessors/getters)
    Workout(void);
    Workout(int, User*, float, int, int, int, int, int);
    virtual ~Workout(void);
    float getDistance();
    void setDistance(float);
};
Workout::Workout(void) : _workoutid(), _distance(), _duration(), _day(), _month(), _year(), _weight()
{
    _owner = new User();
}
Workout::Workout(int id, User* user, float distance, int duration, int day, int month, int year, int weight) :
_workoutid(id), _distance(distance), _duration(duration), _day(day), _month(month), _year(year), _weight (weight), _owner(user)
{
}
Workout::~Workout(void)
{
    delete [] _owner;
}

class User
{
private:
    char* _firstname; // First name
    char* _lastname; // Last name
    char* _loginname; // Login name
    char* _password; // password
    Workout* _myWorkouts[50];// an array of pointers to workouts
    int _numWorkouts; // Num. of workout logged
    User* _buddies[10]; // Friends
    int _numBuddies; // Num. of friends

    // private methods (if necessary)

public:
    friend std::ostream& operator<< (ostream& out, User& user)
    {
        out << "First Name: [" << user._firstname << "]" << endl
            << "Last Name: ["<< user._lastname << "]" << endl
            << "Login Name: [" << user._loginname << "]" << endl
            << "Number of Workouts: [" << user._numWorkouts << "]" << endl
            << "Number of Friends: [" << user._numBuddies << "]" << endl;
        return out;
    }
    User(void);
    User(const char*, const char*, const char*, const char*);
    virtual ~User(void);

    char* getPassword(void);
    char* getLoginName(void);
    char* getFirstName(void);
    void addWorkout(Workout*);
    Workout* getWorkout(int);
    void addBuddy(User* buddy);
    // and other public methods (mutators/setters, accessors/getters)
};
User::User(void) : _firstname(), _lastname(), _loginname(), _password(),
    _myWorkouts(), _numWorkouts(), _buddies(), _numBuddies()
{
}
User::User(const char* first, const char* last, const char* login, const char* pass) : _myWorkouts(), _numWorkouts(), _buddies(), _numBuddies()
{
    _firstname = new char[20];
    _lastname = new char[20];
    _loginname = new char[20];
    _password = new char[20];

    for (int i=0; i < 20; i++){
        _firstname[i] = first[i];
        _lastname[i] = last[i];
        _loginname[i] = login[i];
        _password[i] = pass[i];
    }
}
User::~User(void)
{
    delete [] _firstname;
    delete [] _lastname;
    delete [] _loginname;
    delete [] _password;

    for(int i=0;i<50;i++) delete _myWorkouts[i];
    delete [] _myWorkouts;

    for(int i=0;i<10;i++) delete _buddies[i];
    delete [] _buddies;

    //What about variables such as _numWorkouts and _numBuddies?
}

And I am getting the following errors:

Error 1 error C2027: use of undefined type 'User'

Error 2 error C2228: left of '.getLoginName' must have class/struct/union

The first error is because the operator<< method somehow doesn't want to recognize that the (*wo._owner) object of type User initialized (which it is!) The second error, obviously must be related to the second one, but it doesn't improve my chances of realizing at all how to solve the problem.


回答1:


If this is indeed the structure of your code then you're trying to use "User" before it's defined.

You can't do this.

Declare your output operator as friend if need be and define it after the definition of User is known.



来源:https://stackoverflow.com/questions/12362797/getting-use-of-undefined-type-and-must-have-class-struct-union-errors

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!