4

Seperating classes into files. 1 unresolved externals

view full story
linux-howto

http://www.daniweb.com – Hi there, I'm trying to return base class pointers from the two classes 'base' and 'child', but I keep on getting a build error of "1 unresolved externals". I think it may be because I am linking all the files together incorrectly. When I comment out the problem line in main.cpp it builds fine, but when I try to use it (and return a base class pointer), this is when I cannot build the program. I have copy and pasted my code exactly here: child.cpp : #include "base.h" #include "child.h" #include <iostream> #include <string> using namespace std; //Child class contructor Child::Child(string basestring, string childstring) : Base(basestring) {         _basestring = basestring;         _childstring = childstring; } //Child class function //Return's a base class pointer Child * ReturnPtrToANewChildClassObject() {         //Build an child class object, and then return a pointer to that object         //Wthin main() the pointer will be be pushed into the std:list         string basestring;         cout << "Base string ? " << endl;         getline (cin, basestring);         string childstring;         cout << "Child string ? " << endl;         getline (cin, childstring);         //Get a pointer to the new object         Child *ptr = new Child(basestring, childstring);         //return the pointer to main()         return (ptr); } base.cpp : #include "base.h" #include "child.h" #include <iostream> #include <string> using namespace std; //Base class contructor Base::Base(string basestring) {         _basestring = basestring; } //Base class function Base * ReturnPtrToANewBaseClassObject() {         //Build an object, and then return a pointer to that object         //Wthin main() the pointer will be be pushed into the std:list         string basestring;         cout << "Value? " << endl;         getline (std::cin, basestring);         //Get a pointer to the new object         Base *ptr = new Base(basestring);         //return the pointer to main()         return (ptr); } child.h : #ifndef CHILD_H #define CHILD_H #include <iostream> #include <string> using namespace std; class Child : public Base { public:         //constructor         Child(string basestring, string childstring);         //Member Functions:         static Child * ReturnPtrToANewChildObject();//Create an child object and return a pointer to it private: protected:         //Data Members specific to child class objects (concrete class):         string _childstring; }; #endif base.h : #ifndef BASE_H #define BASE_H #include <iostream> #include <string> using namespace std; class Base { public:         //base class constructor         Base(string basestring);         //Member Functions:         static Base * ReturnPtrToANewBaseClassObject();//Create a base class object and return a pointer to it private: protected:         //Data Members common to all classes (abstract base class):         string _basestring; }; #endif main.cpp : #include <iostream> #include <list> #include "base.h" #include "child.h" using namespace std; int main() {         list<Base *>BaseList;         do{                 char choice;                 cout << "a) Create then add a base class pointer into the list" << endl;                 cin >> choice;                 cin.ignore();                 switch(choice)                 {                 case 'a':                         {                                 //Create an base object and return a pointer to that object                                 Base *ptr = Base::ReturnPtrToANewBaseClassObject();                                 //IT'S THE LINE ABOVE STOPPING THE PROGRAM COMPILING                                                                 //        fatal error LNK1120: 1 unresolved externals                                 //then push_back into the std::list                                 //BaseList.push_back( ptr );                                 cout << "Object now pushed onto the std::list" << endl;                                 break;                         }                 default:                         {                                 cout << "You made an invalid choice" << endl;                                 break;                         }                 }         }         while(true);         system("pause");         return 0; } Visual Studio say's: ------ Build started: Project: deleteMe2, Configuration: Debug Win32 ------ Compiling... main.cpp Linking... main.obj : error LNK2001: unresolved external symbol "public: static class Base * __cdecl Base::ReturnPtrToANewBaseClassObject(void)" (?ReturnPtrToANewBaseClassObject@Base@@SAPAV1@XZ) C:\Documents and Settings\Administrator\My Documents\Visual Studio 2005\Projects\deleteMe2\Debug\deleteMe2.exe : fatal error LNK1120: 1 unresolved externals Build log was saved at "file://c:\Documents and Settings\Administrator\My Documents\Visual Studio 2005\Projects\deleteMe2\deleteMe2\Debug\BuildLog.htm" deleteMe2 - 2 error(s), 0 warning(s) ========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ========== I want to be able to create and store pointers to both base class objects and child objects, but right now this is a problem I cannot seem to solve. Could anyone point out where my problem lies? Thanks very much for any help! It really is most appreciated. Carrots (General)