incomplete type used in nested name specifier

382
27 марта 2017, 09:28

Добрый день показывает мне вот такую ошибкy: incomplete type Team used in nested name specifier вот код main.cpp

#include <iostream>
#include <string>
#include <time.h>
#include <dos.h>
#include "Manager.h"
#include "Soldier.h"
using namespace std;
int main()
{
    srand ( time(NULL) );
    string str;
    Team team;
    Manager manager;
    manager.info();
    //getline(cin, str);
    //manager.getFunction(str);
    cout << "Game over!" << endl;
    return 0;
}

Manager.h

#ifndef MANAGER_H
#define MANAGER_H
#include <iostream>
#include <string>
#include <cstring>
#include <stdio.h>
#include <malloc.h>
using namespace std;
class Team;
class Manager
{
    private:
        typedef struct
        {
            string name;
            int *adress;
        } DB;
        DB funcBase[19];
        string param = "Nike";
    public:
        Manager(){
            cout << "Welcome to the GAME!\nEnter your command to your army!" << endl;
            funcBase[1].name = "addSoldier";
            //funcBase[1].adress = &Team::addSoldier();
        }
        int getFunction(string strng){
            char *str = new char[strng.length()];
            strcpy(str, strng.c_str());
            char *pos = strchr(str, ':');
            int piece_length = pos-str;
            char *str_action = new char[piece_length];
            strncpy(str_action,str, piece_length);
            str_action[piece_length] = '\0';
            cout << str_action << endl;
            delete [] str;
            delete [] str_action;
        }
        int info()
        {
            cout << &Team::addSoldier();
        }
    protected:
};
#endif // MANAGER_H

Soldier.h

#ifndef SOLDIER_H
#define SOLDIER_H

class Team
{
    private:
        int i;
        int soldier_count = 0;
        int power;
        int money = 700;
        typedef struct
        {
            string name;
            int strength;
            int speed;
        } Soldier;
        Soldier Soldiers[19];
    protected:
    public:
        Team(){
                    addSoldier("Andrew");
                    addSoldier("Sanchez");
                    addSoldier("Cody");
                    addSoldier("Bob");
        }
        int update_power()
        {
            i = 0;
            power = 0;
            for(i; i < soldier_count; i++)
                {
                    int newpower = (Soldiers[i].strength*Soldiers[i].speed)/100;
                    power = power + newpower;
                }
        }
        int addSoldier(string inputName){
                if(soldier_count >= 20){cout << "Sorry you can't add more than 20 soldiers in your team:(" << endl; }
                else
                    {
                        if(money < 100) {cout << "You have no money to add new soldier to your team!" << endl;}
                        else
                            {
                                soldier_count++;
                                Soldiers[soldier_count-1].strength = rand()%90 +30;
                                Soldiers[soldier_count-1].speed = rand()%400 + 100;
                                Soldiers[soldier_count-1].name = inputName;
                                money -= 100;
                                update_power();
                            }
                    }
            }
        int getInfo(){
            cout << "Soldiers in your team right now:" << endl << "There are " << soldier_count << " soldiers in your team" << endl;
            for(i = 0; i<soldier_count; i++){
                cout<< "#" << i << " Name:" << Soldiers[i].name << " Strength:" << Soldiers[i].strength<< " Speed:" << Soldiers[i].speed<<endl;
            }
            cout<< "Total POWER is " << power << endl << "You have: " << money << "$" << endl;
        }
        int killSolder(int id)
        {
            if(id<=soldier_count && id>=0)
                {
                    Soldiers[id].name = Soldiers[soldier_count-1].name;
                    Soldiers[id].speed = Soldiers[soldier_count-1].speed;
                    Soldiers[id].strength = Soldiers[soldier_count-1].strength;
                    Soldiers[soldier_count].name.empty();
                    soldier_count--;
                    update_power();
                }
            else{cout << "There is no soldier with id = " << id <<endl;}
        }
        int goToMission(int complexity){
            if(power > 0)
            {
                int chance = 0;
                int mResult = 0;
                chance = power/400;
                mResult = rand()%(101*complexity-chance);
                if(mResult < 50)
                    {
                        i = 0;
                        for(i; i < soldier_count; i++)
                        {
                            Soldiers[i].speed = Soldiers[i].speed + rand()%(10*complexity) + 1;
                            Soldiers[i].strength = Soldiers[i].strength + rand()%(10*complexity) + 1;
                        }
                        money += 10*complexity;
                        cout << "Mission complete! Your solders get stat boost" << endl;
                    }
                    else
                        {
                            killSolder(rand()%(soldier_count - 1));
                            cout << "Mission failed! One of your soldiers dead." << endl;
                        }
                        update_power();
            }
            else{cout << "You should add at least one soldier in your team to start mission!" <<endl;}
        }

};
#endif // SOLDIER_H

ошибка выскакивает в Manager.h, там где пытаюсь вывести адрес метода addSoldier из Team. Как сделать так что бы выводило адрес на метод?

Answer 1

Во-первых, адрес метода класса в С++ получается через выражение вида &Team::addSoldier. Никаких круглых скобок а-ля "вызов функции" там быть не должно.

Во-вторых, стандартный потоковый оператор вывода << не имеет варианта для вывода указателей на члены, поэтому вывести адрес метода вы так не сможете, даже если его получите. (Компилятор на самом деле выберет "наиболее подходящую" перегрузку оператора << для типа bool.)

В-третьих, чтобы получить адрес члена класса необходимо "видеть" полное определение этого класса. Простого объявления вида class Team; совершенно недостаточно. Обеспечивайте такую видимость.

READ ALSO
Изменение порядка свойств в объекте JS

Изменение порядка свойств в объекте JS

Есть два сервера, которые используют одну и ту же БД, но имеют разные способы работы к нейС первого сервера получаю следующий объект:

343
В чем проблема? missing ) after argument list [требует правки]

В чем проблема? missing ) after argument list [требует правки]

Где ошибка? При наведении на star-5 меняет background-position, если убираю мышь с star-5, то должна быть проверка (если star-5 не checked, то меняем background-position) Где...

253
Изменение курсора на странице на свой. JS

Изменение курсора на странице на свой. JS

На стандартные курсоры я сделал кнопку, при нажатии вызывается функция аргументом которой является имя курсора; В функции присваивается...

259
Как в массив объектов записать значение из консоли

Как в массив объектов записать значение из консоли

Добрый вечер, не могу разобраться с небольшим скриптом

237