Ошибки «Неразрешенный внешний символ» при создании объекта в C ++ - PullRequest
0 голосов
/ 23 сентября 2010

Я довольно опытный программист, но сейчас я погружаюсь в C ++, и это ... ну ... сложнее, чем PHP и Python. Я продолжаю иметь неразрешенные внешние ошибки при попытке создать объект из некоторых классов. Он разбит на несколько заголовков и файлов, но вот основная идея одного из моих классов:

die.h:

#ifndef DIE_H
#define DIE_H

using namespace std;

class Die {
 public: 
  int throwDie();
  Die();
};

#endif

die.cpp

#include <iostream>
#include <cstdlib>
#include "Die.h"

using namespace std;

int Die::throwDie() 
{
 return 0;
}

sixsidedie.h

#ifndef SIXSIDEDIE_H
#define SIXSIDEDIE_H

#include "Die.h"

using namespace std;

class SixSideDie : public Die
{
 public:
  SixSideDie();
  int throwDie();

 private: 
         int randNumber;
};

#endif

sixsidedie.cpp

#include <iostream>
#include <cstdlib>
#include <time.h>
#include "Die.h"
#include "SixSideDie.h"

using namespace std;

const int SIX_SIDE = 6;

int SixSideDie::throwDie()
{
 srand((unsigned int)time(0));
 SixSideDie::randNumber = rand() % SIX_SIDE + 1;
 return SixSideDie::randNumber;
}

main.cpp

#include <iostream>
#include <cstdlib>
#include "Die.h"
#include "SixSideDie.h"
#include "TenSideDie.h"
#include "TwentySideDie.h"

using namespace std;

int main() 
{
 Die* myDice[3];
 myDice[0] = new SixSideDie();
 myDice[1] = new TenSideDie();
 myDice[2] = new TwentySideDie();

 myDice[0]->throwDie();
 myDice[1]->throwDie();
 myDice[2]->throwDie();

 system("pause");
 return 0;
}

Мне все время говорят, что каждый объект, который я создаю непосредственно выше, является неразрешенным внешним символом, и я просто не знаю, почему. Есть мысли!?

Ответы [ 3 ]

5 голосов
/ 23 сентября 2010

Вы объявили конструктор для Die, но никогда не определяли его.

Кроме того, вы почти наверняка хотите, чтобы throwDie был виртуальным, если вы намерены переопределить его поведение в производных классах, и вам никогда не следует использовать using namespace std; в заголовочном файле (и многие, в том числе и я, утверждают, что вы его вообще не следует использовать в области видимости файла).

1 голос
/ 23 сентября 2010

Это хорошая практика для определения конструкторов классов. Проверьте это:

#ifndef DIE_H
#define DIE_H

using namespace std;

class Die {
 public: 
  int throwDie();
  Die() { };  // can you spot the difference here?
};

#endif
1 голос
/ 23 сентября 2010

Вы не определили свой конструктор в ваших файлах cpp.

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