2015-09-23 5 views
-1

Я пытаюсь объявить два класса С1 и С2 в файлах nstest1.h и nstest2.h которые определены в файлах nstest1.cpp и nstest2.cpp соответственно. Оба класса определены в одном пространстве имен.Используя одно пространство имен в C++ для двух классов объявленных и определенных в отдельных файлах

Ниже перечислены файлы:

//nstest1.h 
namespace Mine{ 
    class C1{ 
     public: 
     void callme(); 
    }; 
} 

//nstest2.h 
namespace Mine { 
    class C2 { 
     public: 
      void callme(); 
    }; 
} 

//nstest1.cpp 
#include<iostream> 
#include "nstest1.h" 

using namespace std; 
using namespace Mine; 

void Mine::C1::callme(){ 
    std::cout << "Please call me " << std::endl; 
} 

//nstest2.cpp 
#include<iostream> 
#include "nstest2.h" 

using namespace std; 
using namespace Mine; 

void Mine::C2::callme(){ 
    std::cout << "Please call me too" << std::endl ; 
} 

После файла пытается использовать эти классы, используя пространство имен Mine.

//nstest.cpp 
#include<iostream> 
#include "nstest1.h" 
#include "nstest2.h" 

using namespace std; 
using namespace Mine; 

int main(){ 
    Mine::C1 c1; 
    Mine::C2 c2; 
    c1.callme(); 
    c2.callme(); 
    return 0; 
} 

Когда я компилирую с помощью команды "г ++ nstest.cpp", я получаю следующее сообщение об ошибке:

/tmp/cc2y4zc6.o: In function `main': 
nstest.cpp:(.text+0x10): undefined reference to `Mine::C1::callme()' 
nstest.cpp:(.text+0x1c): undefined reference to `Mine::C2::callme()' 
collect2: error: ld returned 1 exit status 

Если определения перемещаются в декларации файлов (nstest1.h и nstest2.h), он отлично работает. Не уверен, что происходит здесь. Я что-то упускаю ? Спасибо заранее.

+1

Скомпилируйте с помощью 'g ++ nstest1.cpp nstest2.cpp nstest.cpp'. Вам нужно скомпилировать все исходные файлы. –

+0

Спасибо :). Он отлично подходит для этого случая. Но возможно ли избежать компиляции деклараций и определений каждый раз? – Chandrahas

+0

Единственный способ включить определение внутри файла заголовка. Компилятор должен увидеть реализацию. Вы также можете использовать make-файл для автоматической компиляции исходных файлов, [пример] (http://stackoverflow.com/questions/231229/how-to-generate-a-makefile-with-source-in-sub-directories-using- just-one-makefil/2484343 # 2484343), тогда все, что вам нужно сделать, это вызвать 'make', чтобы скомпилировать все. –

ответ

3

При создании программы вам необходимо включить другие .cpp-файлы.

Вариант 1: Компиляция все файлы и создать исполняемый файл в одной команде

g++ nstest.cpp nstest1.cpp nstest2.cpp -o nstest 

Вариант 2: Компиляция каждый файл по отдельности, а затем построить исполняемый после этого

g++ -c nstext1.cpp 
g++ -c nstest2.cpp 
g++ -c nstest.cpp 
g++ nstest.o nstest1.o nstext2.o -o nstest 
+0

Спасибо :). Вариант 2 будет работать для меня. – Chandrahas

1

Ваша проблема происходит на время ссылки. Ваши заголовки в порядке. Но вы также должны скомпилировать другие файлы cpp.

Смежные вопросы