Только что начал C ++: неопределенная ошибка символа при компиляции - PullRequest
1 голос
/ 09 февраля 2009

Вот ситуация:

Я только начал свой первый класс C ++. Я ничего не знаю о C ++, и, несмотря на то, что он является введением в класс C ++, учитель почти не учил синтаксис языка, только логику, которую мы уже знаем.

Теперь он дал нам описание программы и сказал: "Напиши это, смеется". Я прекрасно понимаю логику, но, как я уже говорил, я ничего не знаю о C ++. Таким образом, я написал это сначала в Java (что я знаю), а затем, как только я начал работать в Java, я попытался закодировать его в C ++.

Однако теперь я получаю следующую ошибку при компиляции

uxb3% g++ -o Race race.cc
Undefined                       first referenced
 symbol                             in file
main                                /usr/local/gcc-4.1.1/bin/../lib/gcc/sparc-sun-solaris2.10/4.1.1/crt1.o
ld: fatal: Symbol referencing errors. No output written to Race
collect2: ld returned 1 exit status

Может кто-нибудь помочь мне с этим?

Вот мой код в текстовом файле: http://rapidshare.com/files/195742284/race.txt.html

и вот оно в копировальной пасте:

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

using namespace std;
class Race
{

        void main()
        {
                executeRace();
        }

        int randomMove()
        {
                srand(time(NULL));
                int randomInt = rand() % 100 + 1;
                return randomInt;
        }

        void executeRace()
        {
                int rabbitPosition = 1;
                int turtlePosition = 1;

                cout << "BANG!!!" << endl << "AND THEY'RE OFF!!!";

                while (rabbitPosition <=70 && turtlePosition <=70)
                {
                        printPositions(rabbitPosition, turtlePosition);

                        turtlePosition = turtleMoveSquares(turtlePosition);
                        rabbitPosition = rabbitMoveSquares(rabbitPosition);
                }

                printWinner(rabbitPosition, turtlePosition);

                tie(rabbitPosition, turtlePosition);
        }

        int turtleMoveSquares(int tPosition)
        {

                int turtleMove = randomMove();

                if(turtleMove >=1 && turtleMove <= 40)
                        tPosition = tPosition + 4;

                if(turtleMove >= 41 && turtleMove <= 50 )
                        tPosition = tPosition - 2;

                if(turtleMove >=51 && turtleMove <=100)
                        tPosition = tPosition + 2;

                if(tPosition < 1)
                        tPosition = 1;

                return tPosition;
        }


        int rabbitMoveSquares(int rabbitPosition)
        {

                int rabbitMove = randomMove();

                if(rabbitMove >=1 && rabbitMove <= 25)
                        rabbitPosition = rabbitPosition;

                if(rabbitMove >=26 && rabbitMove <= 55)
                        rabbitPosition = rabbitPosition + 10;

                if(rabbitMove >=56 && rabbitMove <=60)
                        rabbitPosition = rabbitPosition - 15;

                if(rabbitMove >=61 && rabbitMove <= 90)
                        rabbitPosition = rabbitPosition + 5;

                if(rabbitMove >=90 && rabbitMove <=100)
                        rabbitPosition = rabbitPosition - 3;

                if(rabbitPosition < 1)
                        rabbitPosition = 1;

                return rabbitPosition;
        }

        void printPositions(int rabbitPositions, int turtlePositions)
        {
                int turtleCount;
                int rabbitCount;
                int endCount;

                if(rabbitPositions == turtlePositions && rabbitPositions != 1)
                {
                        turtleCount = 1;

                        while(turtleCount < turtlePositions)
                        {
                                cout << "-";
                                turtleCount = turtleCount+1;
                        }
                        cout << "OUCH!";
                }

                else
                {
                        turtleCount = 1;
                        rabbitCount = 1;
                        endCount=1;

                        if(turtlePositions < rabbitPositions)
                        {
                                while(turtleCount < turtlePositions)
                                {
                                        cout <<  "-";
                                                turtleCount = turtleCount+1;
                                }

                                cout << "T";

                                while(rabbitCount < (rabbitPositions - turtlePositions))
                                {
                                        cout <<  "-";
                                        rabbitCount = rabbitCount+1;
                                }
                                cout << "H";

                        }

                        if(rabbitPositions < turtlePositions)
                        {
                                while(rabbitCount < rabbitPositions)
                                {
                                        cout << "-";
                                                rabbitCount = rabbitCount+1;
                                }
                                cout << "H";

                                while(turtleCount < (turtlePositions - rabbitPositions))
                                {
                                        cout << "-";
                                        turtleCount = turtleCount+1;
                                }
                                cout << "T";

                                cout << "\n";
                        }
                }
        }

        void printWinner(int rabbitPosition, int turtlePosition)
        {
                if(turtlePosition >= 70 && rabbitPosition < 70)
                {
                        cout << "TORTOISE WINS!!! YAY!!!\n";
                }
                else if(rabbitPosition >=70 && turtlePosition < 70)
                {
                        cout << "Hare wins. Yuch.\n";
                }
                else if(rabbitPosition >=70 && turtlePosition >=70)
                {
                        cout << "It's a tie\n";
                }
        }

        void tie(int turtlePosition, int rabbitPosition)
        {
                if(rabbitPosition >=70 && turtlePosition >=70)
                        executeRace();
        }
};

Ответы [ 6 ]

14 голосов
/ 09 февраля 2009

Он жалуется на то, что main не определен, и это правильно. C и C ++ требуют автономную функцию с именем main, которая возвращает int. Недостаточно иметь класс с методом с именем main; Компилятор заботится только об автономном.

Еще одна вещь, которую следует помнить, это то, что видимость по умолчанию для членов типа class - private . Либо измените свой класс на использование struct - это почти единственное различие между ними - либо укажите публичную видимость:

class Race {
public:
  void main() { ... }
};

Затем вы можете вызвать функцию main из вашего класса:

int main() {
  Race race;
  race.main();
  return EXIT_SUCCESS;
}
3 голосов
/ 09 февраля 2009

C ++ на самом деле не похож на Java. Например, функции не обязательно должны быть частью класса. Вам нужно переместить функцию main () так, чтобы она находилась вне класса.

class Race {
  // stuff
};

int main() {
  // stuff
}
3 голосов
/ 09 февраля 2009

Вам нужна основная функция:

// The arguments are only needed if passing arguments to your program.
// You could just use `int main()`.
int main(int argc, char** argv)
{
    Race race;
    race.executeRace();
}

или около того, не видя вашей конкретной ошибки.

3 голосов
/ 09 февраля 2009

Вам нужна функция main (), чтобы задать программе начальную точку:

int main()
{
     // whatever...
     // Maybe:

     Race race;

     race.main();
}

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

2 голосов
/ 09 февраля 2009

Возможно, это то, что вы имели в виду

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

using namespace std;



class Race
{

public:
    void ExecuteRace()
    {
        int rabbitPosition = 1;
        int turtlePosition = 1;

        cout << "BANG!!!" << endl << "AND THEY'RE OFF!!!";

        while (rabbitPosition <=70 && turtlePosition <=70)
        {
            printPositions(rabbitPosition, turtlePosition);

            turtlePosition = turtleMoveSquares(turtlePosition);
            rabbitPosition = rabbitMoveSquares(rabbitPosition);
        }

        printWinner(rabbitPosition, turtlePosition);

        tie(rabbitPosition, turtlePosition);
    }

private:
    int randomMove()
    {
        srand(time(NULL));
        int randomInt = rand() % 100 + 1;
        return randomInt;
    }


    int turtleMoveSquares(int tPosition)
    {

        int turtleMove = randomMove();

        if(turtleMove >=1 && turtleMove <= 40)
            tPosition = tPosition + 4;

        if(turtleMove >= 41 && turtleMove <= 50 )
            tPosition = tPosition - 2;

        if(turtleMove >=51 && turtleMove <=100)
            tPosition = tPosition + 2;

        if(tPosition < 1)
            tPosition = 1;

        return tPosition;
    }


    int rabbitMoveSquares(int rabbitPosition)
    {

        int rabbitMove = randomMove();

        if(rabbitMove >=1 && rabbitMove <= 25)
            rabbitPosition = rabbitPosition;

        if(rabbitMove >=26 && rabbitMove <= 55)
            rabbitPosition = rabbitPosition + 10;

        if(rabbitMove >=56 && rabbitMove <=60)
            rabbitPosition = rabbitPosition - 15;

        if(rabbitMove >=61 && rabbitMove <= 90)
            rabbitPosition = rabbitPosition + 5;

        if(rabbitMove >=90 && rabbitMove <=100)
            rabbitPosition = rabbitPosition - 3;

        if(rabbitPosition < 1)
            rabbitPosition = 1;

        return rabbitPosition;
    }

    void printPositions(int rabbitPositions, int turtlePositions)
    {
        int turtleCount;
        int rabbitCount;
        int endCount;

        if(rabbitPositions == turtlePositions && rabbitPositions != 1)
        {
            turtleCount = 1;

            while(turtleCount < turtlePositions)
            {
                cout << "-";
                turtleCount = turtleCount+1;
            }
            cout << "OUCH!";
        }

        else
        {
            turtleCount = 1;
            rabbitCount = 1;
            endCount=1;

            if(turtlePositions < rabbitPositions)
            {
                while(turtleCount < turtlePositions)
                {
                    cout <<  "-";
                    turtleCount = turtleCount+1;
                }

                cout << "T";

                while(rabbitCount < (rabbitPositions - turtlePositions))
                {
                    cout <<  "-";
                    rabbitCount = rabbitCount+1;
                }
                cout << "H";

            }

            if(rabbitPositions < turtlePositions)
            {
                while(rabbitCount < rabbitPositions)
                {
                    cout << "-";
                    rabbitCount = rabbitCount+1;
                }
                cout << "H";

                while(turtleCount < (turtlePositions - rabbitPositions))
                {
                    cout << "-";
                    turtleCount = turtleCount+1;
                }
                cout << "T";

                cout << "\n";
            }
        }
    }

    void printWinner(int rabbitPosition, int turtlePosition)
    {
        if(turtlePosition >= 70 && rabbitPosition < 70)
        {
            cout << "TORTOISE WINS!!! YAY!!!\n";
        }
        else if(rabbitPosition >=70 && turtlePosition < 70)
        {
            cout << "Hare wins. Yuch.\n";
        }
        else if(rabbitPosition >=70 && turtlePosition >=70)
        {
            cout << "It's a tie\n";
        }
    }

    void tie(int turtlePosition, int rabbitPosition)
    {
        if(rabbitPosition >=70 && turtlePosition >=70)
            ExecuteRace();
    }
};


void main()
{
    Race race;
    race.ExecuteRace();
}
1 голос
/ 09 февраля 2009

У вас нет основной функции.

Самым большим отличием C ++ от Java является то, что его функция main () имеет эту сигнатуру (необязательные параметры):

int main(int argc, char** argv);

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

Попробуйте добавить это в вашу программу:

int main() {
    Race r;
    r.main();
    return 0;
}

Кроме того, вы можете полностью покончить с классом, поскольку на самом деле вы ничего с ним не делаете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...