Member 13700372 Ответов: 1

Ошибка "нет соответствующей функции для вызова" при попытке отображения


У меня есть следующий класс, написанный для описания типа даты утконоса, и у меня возникают проблемы при попытке отобразить результаты. Это основная функция, в которой у меня возникли проблемы с отображением выходных данных.

#include "Platypus.h"
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;

int main()
{
    Platypus p1('F', 6.5, 2, 'B', true, true);
    Platypus p2('M', 10.0, 3, 'C', true, true);
    p1.display();
    p1.age_me(2);
    p1.display();
    p1.eat();
    p1.display();
    p2.display();
    p2.age_me(3);
    p1.fight(p2);
    p1.display();
    Platypus p3.hatch;
}


Я получаю сообщение об ошибке, что нет соответствующей функции для вызова функции Platypus::display() и что ни одна из моих функций не существует в классе Platypus. Я действительно не знаю, с чего начать, чтобы исправить это. У меня действительно есть заголовочный файл, но я его оставил, так как он уже прилично длинный. Я довольно новичок в C++ и классах, поэтому любая помощь будет очень признательна.

#include <iostream>
#include <cstdlib>
#include <ctime>

#include "Platypus.h"

using namespace std;

#ifndef PLATYPUS_H_INCLUDED
#define PLATYPUS_H_INCLUDED

class Platypus {

    public:

        Platypus::Platypus()
            : weight(0.0), age(0), name('A'), gender('M'), alive(false), mutant(false)        
        {
        }

        Platypus::Platypus(char gender, float weight, short age, char name, bool alive, bool mutant)   
        {
            bool alive = true;
            bool mutant = false;

            myWeight = weight;
            myAge = age;
            myName = name;
            myGender = gender;
            myAlive = alive;
            myMutant = mutant;
        }

        unsigned Platypus::getWeight() const; 
        {
            return myWeight;
        }
        unsigned Platypus::getAge() const;     
        {
            return myAge;
        }
        unsigned Platypus::getName() const;   
        {
            return myName;
        }
        unsigned Platypus::getGender() const;  
        {
            return myGender;
        }
        unsigned Platypus::getAlive() const;    
        {
            return myAlive;
        }
        unsigned Platypus::getMutant() const;  
        {
            return myMutant;
        }

        void Platypus::display(ostream & out) const
        {
            out << "Name is" << myName << endl
                << "Gender is" << myGender << endl
                << "Weight is" << myWeight << "lbs" << endl
                << "Age is" << myAge << "months" << endl;

            if (myAlive == true) {
                out << "Alive: "
                    << "Yes"
                    << endl;
            }
            else {
                out << "Alive: "
                    << "No"
                    << endl;
            }
            if (myMutant == true) {
                out << "Mutant : "
                    << "Yes"
                    << endl;
            }
            else {
                out << "Mutant: "
                    << "No"
                    << endl;
            }
        }

        void age_me(short inc)
        {
            myAge += inc;

            srand(time(NULL));
            int rand_mut = (rand() % 100) + 1;

            if(rand_mut <= 2)
            {
                myMutant = true;
            }

            if(rand_mut <= 10 * weight)
            {
                myAlive = false;
            }
            if(weight >= 10)
            {
                myAlive = false;
            }
        }

        void fight(Platypus & p)
        {
            srand(time(NULL));                                                      
            int fight_ratio = (getWeight() / p.getWeight()) * 50;       
            int random_ratio =  (rand() % 100) + 1;                     

            if(random_ratio < fight_ratio)                              
                p.setmyAlive = false;
            {
            }
            else                                                        
            {
                myAlive = false;
            }
        }

        void eat()
        {
            if(myAlive == true)
            {
                float rand_weight = 5.0 + static_cast<float>(rand()) / (static_cast<float>(RAND_MAX / (0.5 - 5)));  
                weight = weight + rand_weight;    
            }

        }

        void hatch()
        {
            srand(time(NULL));

            char newName = 97 + rand() % 26;  

            alive = true;    //alive defaulted to true
            mutant = false;
            age = 0;

            int rand_gender = rand() % 50 + 1;    
            if(rand_gender <= 25)    
            {
                gender = 'M';
            }
            else
            {
                gender = 'F';
            }

            float newrand_weight = 1.0 + static_cast<float>(rand()) / (static_cast<float>(RAND_MAX / (0.5 - 1)));   
            weight = newRand_weight;  

            char newName = 97 + rand() % 26;  
            name = newName;
        }
}
#endif


Что я уже пробовал:

Передача p1 в параметрах дисплея

1 Ответов

Рейтинг:
10

Rick York

Я вижу пару ошибок. Первый прототип к способу отображения это :

void Platypus::display(ostream & out) const

и ваш призыв к этому таков :
p1.display();

Вам нужно передать ему острие, как Коут.

Другая проблема гораздо серьезнее. Заголовочный файл действительно испорчен. Материал в верхней части заголовочного файла (то есть, я думаю, что это заголовочный файл - второй список) должен быть в верхней части основного модуля.
#include <iostream>
#include <cstdlib>
#include <ctime>

#include "Platypus.h"

using namespace std;

int main()
{
// ...
}


Заголовочный файл должен выглядеть следующим образом:
#ifndef PLATYPUS_H_INCLUDED
#define PLATYPUS_H_INCLUDED

class Platypus
{
public:
    Platypus()
    : weight(0.0)
    , age(0)
    , name('A')
    , gender('M')
    , alive(false)
    , mutant(false)        
    {
    }

    unsigned getWeight() const; 
    {
       return myWeight;
    }
};

#endif

Поскольку у вас есть реализация в заголовочном файле, в определении класса вы не ставите имя класса и двоеточия перед каждым методом. Это делается только в отдельном исходном файле реализации, обычно называемом Platypus.cpp для этого класса.

Я показал, как должны быть определены только два метода, но все они должны следовать этой схеме
то есть опустить "Утконос::" перед каждым именем метода в заголовочном файле.


Rick York

Еще одно замечание - я бы, вероятно, реализовал метод Set для этого класса. Оба конструктора будут вызывать его так же, как конструктор копирования и оператор присваивания, если вы их реализуете. Я думаю, что они полезны с небольшим количеством членов, но могут стать громоздкими с большим количеством.

Мне просто пришло в голову, что я не уверен, что вы показали заголовочный файл, потому что я не вижу объявлений членов данных, что означает, что это файл .cpp, реализация. Если это так, то вам действительно нужна часть "Утконос::" перед каждым методом, но вы не хотите включать охрану или "класс Утконос" и заканчивать "};" там. Они должны быть только в заголовочном файле.