неопределенная ошибка ссылки, что мне делать? - PullRequest
0 голосов
/ 13 июня 2018

Здравствуйте, я здесь впервые и мне нужна помощь. Мне нужно отправить окончательный проект, "памятную записку", но она показывает мне эту проблему:

main.cpp :(.text + 0xa95): неопределенная ссылка на `inicio (std :: string *, std :: string *) '

main.cpp :(. text + 0x1586): неопределенная ссылка на` over ()'

Я не знаю, почему, я тоже говорю по-испански, поэтому код представляет собой гибрид между английским и испанским, вот код: пожалуйста, кто-нибудь, помогите мне

Main.cpp

#include <iostream>
#include <string>
#include <windows.h>
#include <time.h>
#include <unistd.h>
#include "Jugadores.h"
using namespace std;

void inicio (string* j1, string* j2);
void over (void);
int main() 
{
    string materias[]={"", "Calculo", "Programacion", "Ingles", "Fisica", "Español", "Politica", "Deporte", "Matematicas", "Aula", "Fundamentos", "IPOO", "Algebra"};
    string nuevo[24];
    nuevo [0]="0";
    string posicion[]={"","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20","21","22","23","24"};
    int ale[24]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
    int numeroa;
    srand (time(NULL));
    string auxiliop, auxilios;
    int i=1,P,S,j=1,p;
    int rep;
    int pares=0;
    int pj1=0,pj2=0,turn=2;
    string d1, d2;
    int ocupados[24];
    int z=0,r=0, yaesta;
    Jugadores jugador1;
    Jugadores jugador2;
    inicio(&d1, &d2);
    jugador1.ingresanombre(d1);
    jugador2.ingresanombre(d2);
    sleep(1000);
    while(i<=24)
    {
        numeroa=1+rand()%24;
        rep=0;
        j=1;
        while(j<=24)
        {
            if (numeroa=ale[j])
            {
                rep=1;
            }
            j++;
        }
        if (rep!=1)
        {
            ale[i]=numeroa;
            i++;
        }
    }
    cout<<"\n\n\n";
    for (i=1;i<=24;i++)
    {
        nuevo[i]=materias[ale[i]];
    }
    cout<<"\n\n";
    i=1;
    while(i<=24)
    {
        cout<<"\t" << posicion[i];
        if (i==6 || i==12 || i==18 || i==24) cout<<"\n\n\n";
        i++;
    }
    i=1;
    while (pares<12)
    {
        cout << "\n\n";
        if (turn%2==0)
        {
            cout << "Es turno de: " << jugador1.mostrarnombre();
        }
        else
        {
            cout << "Es turno de: " << jugador2.mostrarnombre();
        }
        cout << "\nEscoge 2 numeros mostrados en pantalla: \nNumero1: ";
        cin >> P;
        cout << "\nNumero 2: ";
        cin >> S;
        for (r=0;r<=z;r++)
        {
            if (ocupados[r]==P||ocupados[r]==S)
            {
                yaesta=1;
            }
        }
        system ("cls");
        rep=1;
        while (rep == 1)
        {
            if (P==S || P<24 || P<1 || S<24 || S<1 || yaesta==1)
            {
                cout<< "\nError al introducir los datos\nIngresa unos nuevos:\n\n";
                cout<<"Numero 1: ";
                cin >> P;
                cout<< "\nNumero 2: ";
                cin >> S;
                system ("cls");
                yaesta=0;
            }
            else rep=2;
            if (nuevo[P]==nuevo[S])
            {
                ocupados[z]=P;
                ocupados[z+1]=S;
                z+=1;
                pares=pares+1;
                if (turn%2==0)
                {
                    jugador1.entrapuntuacion(1);
                }
                else
                {
                    jugador2.entrapuntuacion(1);
                }
                system ("cls");
                cout<< "\n\n\tCorrecto!!\n\n";
                posicion[P]=nuevo[P];
                posicion[S]=nuevo[S];
                i=1;
                cout<<"\n";
                while (i<=24)
                {
                    cout << "\t" << posicion [i];
                    if (i==6||i==12||i==18||i==24) cout<<"\n\n\n";
                    i++;
                }
            }
            else
            {
                auxiliop=posicion[P];
                auxilios=posicion[S];
                posicion[P]=nuevo[P];
                posicion[S]=nuevo[S];
                i=1;
                cout << "\n";
                while (i <= 24)
                {
                    cout << "\t" << posicion[i];
                    if (i==6||i==12||i==18||i==24) cout << "\n\n\n";
                    i++;
                }
                posicion[P]=auxiliop;
                posicion[S]=auxilios;
                sleep(2000);
                system("cls");
                turn++;
                cout << "\n\nCambio de jugador!!\n\n\n";
                i=1;
                while (i<=24)
                {
                    cout<< "\t" << posicion[i];
                    if (i==6||i==12||i==18||i==24) cout<< "\n\n\n";
                    i++;
                }           
            }
            cout<< "\n los puntos de " << jugador1.mostrarnombre() << " son " << jugador1.mostrarpuntuacion();
            cout<< "\n los puntos de " << jugador2.mostrarnombre() << " son " << jugador2.mostrarpuntuacion() << endl;
        }
        if(jugador1.mostrarpuntuacion() > jugador2.mostrarpuntuacion())
        {
            cout<<jugador1.mostrarnombre() << "\tEs el ganador!!";
        }
        else if (jugador1.mostrarpuntuacion()==jugador2.mostrarpuntuacion())
        {
            cout << "\n\n\t\tTenemos un empate!!";
        }
        else
        {
            cout << jugador2.mostrarnombre() << "\tEs el ganador!!";
        }
        sleep(2000);
        system("cls");
        for (p=0;p<10;p++)
        {
            sleep(500);
            over();
            sleep(500);
            system("cls");
        }
    }
    void over (void);
    {
        cout<<"\t\n•••••  •••••  •     •  •••••  •   •  •• •••   •••••\n";
        cout<<"•      •   •  ••   ••  •      •   •  •       •    •\n";
        cout<<"•  ••  •••••  •  •  •  ••••   •   •  ••••    ••••• \n";
        cout<<"•   •  •   •  •     •  •       • •   •       •  •  \n";
        cout<<"•••••  •   •  •     •  •••••    •    •••••   •   • \n";
    }
    void inicio (string* j1, string* j2);
    {
        cout << "Bienvenido";
    }

    string *j1, *j2;
    sleep(1000);
    cout << "\n\n\n\n\t\t\t\tNombre Jugador 1: ";
    cin>> *j1;
    cout << "\n\n\t\t\t\tNombre Jugador 2: ";
    cin>> *j2;
    system("cls");
    cout<<"\n\n\n\n\n\n\n\t\t\t\t" << *j1 << "\t vs \t" << *j2;
    sleep(1000);
    cout << "\n\n\n\t\t";
    system("pause");
    system("cls");
}

Jugador.h

#ifndef JUGADORES_H
#define JUGADORES_H
#include <string>

using namespace std;
class Jugadores
{
    private:
        int puntos;
        string Nombre;

    public:
        void entrapuntuacion(int);
        int mostrarpuntuacion(void);
        void ingresanombre(string );
        string mostrarnombre(void);
};

#endif

Jugador.cpp

#include "Jugadores.h"
#include <string>
#include <windows.h>
#include <time.h>

using namespace std;

void Jugadores::entrapuntuacion(int P)
{
    if (P==1)
    {
        puntos++;
    }
}

int Jugadores::mostrarpuntuacion()
{
    return(puntos);
}

void Jugadores::ingresanombre(string N)
{
    Nombre=N;
}

string Jugadores::mostrarnombre(void)
{
    return(Nombre);
}

Ответы [ 2 ]

0 голосов
/ 13 июня 2018

C ++ не позволяет определить функцию внутри другой функции.Вы достаточно хорошо это скрыли, и мне пришлось много раз читать код, чтобы понять, что происходит.

Вершина файла верна:

using namespace std;

void inicio (string* j1, string* j2);
void over (void);
int main() 
{
    ...

Это объявляет inicio и over являются функциями, а определяет main.

Давайте посмотрим на определение функций

void over (void);
{
    cout<<"\t\n                      \n";
    cout<<"                                      \n";
    cout<<"                         \n";
    cout<<"                                       \n";
    cout<<"                             \n";
}
void inicio (string* j1, string* j2);
{
    cout << "Bienvenido";
}

string *j1, *j2;
sleep(1000);
cout << "\n\n\n\n\t\t\t\tNombre Jugador 1: ";

Это происходит внутри определения основного.Из-за точки с запятой (;) в конце void over(void); и void inicio (string* j1, string* j2); эти строки являются только объявлениями функций.А далее следует просто блок инструкций, которые скомпилированы как часть main.

Что нужно сделать: просто определить функции после окончания main:

    ...
    cout << "\n\n\n\t\t";
    system("pause");
    system("cls");
}
void over (void)                   // note the suppression of ;
{
    cout<<"\t\n                      \n";
    cout<<"                                      \n";
    cout<<"                         \n";
    cout<<"                                       \n";
    cout<<"                             \n";
}
void inicio (string* j1, string* j2)
{
    cout << "Bienvenido";
}
0 голосов
/ 13 июня 2018
  • <string.h> - заголовок языка C для работы со строками const char*.
  • <string> - заголовок языка C++ для работы с std::stringстроки.

Так что просто удалите этот .h из ваших #include строк.

Как правило, любой заголовок C будет иметь .h, но любой C++ заголовок не будет.Обратите внимание, что существуют C++ версии заголовков C, которые слегка меняют имя.Например, <stdio.h> в C становится <cstdio> в `C ++.

Поэтому в вашем коде вы также можете изменить <time.h> на <ctime>.

Но не применяется для <unistd.h>, потому что это стандарт POSIX библиотека, не C стандартная библиотека.

Да,это сбивает с толку ...

...