2015-06-15 1 views
0

SpiralTest.hКак получить доступ к переменной, которая объявить в пространстве имен в другой файл CPP

#ifndef SPIRALTEST_H_ 
#define SPIRALTEST_H_ 
namespace eveready 
{ 
struct TNotes{ 
    int pie; 
    void meth(); 
}; 
extern TNotes tell; 
} 
#endif /* SPIRALTEST_H_ */ 

SpiralTest.cpp

#include "SpiralTest.h" 

namespace eveready 
{ 
void TNotes::meth(){ 
pie=0; 
} 
} 

Теперь я пытаюсь получить доступ к переменной пирог в аЬс .cpp

abc.cpp

#include "SpiralTest.h" 
using namespace eveready; 
tell.meth(); 

но он показывает ошибку, когда я скомпилировать (.text + 0x49): неопределенная ссылка на `Eveready :: сказать»

я попытался также `Eveready :: tell.meth(); но снова он показывает ту же ошибку. что мне делать ..?

+1

Возможный дубликат [Использовать переменную в нескольких файлах Cpp] (http://stackoverflow.com/questions/12064879/use-variable-across-multiple-cpp-files) – Identity1

+0

Это C++, правильно? Не C (C не имеет пространств имен)? –

+0

правый..и это C++ –

ответ

1

Этот

extern TNotes tell; 

просто декларация имени tell. Вы должны определить соответствующий объект, например, в abc.cpp

#include "SpiralTest.h" 
using namespace eveready; 

//... 

TNotes tell; 
//.. 
tell.meth(); 

Примите во внимание, что вызов функции должен быть в какой-либо другой функции. Это может быть не в пространстве имен.

+0

В файле cpp это возможно лучше (избегает возможности для двусмысленности), чтобы обойтись без использования пространства имен всегда, и просто определить 'eveready :: TNotes eveready :: tell' – Peter

+0

@Peter Это вопрос об ошибке. Я не собираюсь изменять исходный код, который можно скопировать из какой-либо книги на C++. –

+0

Я не предлагаю вам изменить код OP. Мой комментарий имел отношение к вашему. – Peter

0

Вы должны перепроектировать программу. Плохо программирование спагетти с глобалами. Вместо того, чтобы использовать объектно-ориентированное проектирование (с последовательным кодом форматирования):

SpiralTest.h

#ifndef SPIRALTEST_H_ 
#define SPIRALTEST_H_ 
namespace eveready 
{ 
    class TNotes 
    { 
    private: 
     int pie; 
    public: 
     void meth(); 
    }; 
} 
#endif /* SPIRALTEST_H_ */ 

SpiralTest.cpp

#include "SpiralTest.h" 

namespace eveready 
{ 
    void TNotes::meth() 
    { 
    pie=0; 
    } 
} 

abc.cpp

#include "SpiralTest.h" 
#include "the_file_where_tell_variable_is_allocated.h" 

using namespace eveready; 

TNotes tell = some_class_in_that_other_file.get(); 
tell.meth(); 
0

структуры являются устаревшими в C++. Вы объявляете, что говорите как extern в SpiralTest.h, что означает, что компилятор считает, что ему будет выделено место хранения в другом месте. Поэтому, когда он встречается в abc.cpp, компоновщик выдает ошибку.

1) Используйте класс вместо структур. 2) define tell (возможно, конструктор класса TNotes) в Spiraltest.cpp или abc.cpp

0

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

Другая вещь пытается инициализировать значение пирогом то же самое можно сделать с помощью конструктора вашего struct TNotes

Ниже перечислены файлы с изменениями и которые работают, как ожидалось.

Примечание: Я добавил определение meth() для тестирования моего кода.

SpiralTest.h

#ifndef SPIRALTEST_H_ 
#define SPIRALTEST_H_ 

namespace eveready 
{ 
    struct TNotes 
    { 
    int pie; 
    void meth(); 
    TNotes(int x) 
    { 
     pie = x; 
    } 
    }; 
} 

#endif /* SPIRALTEST_H_ */ 

SpiralTest.cpp

#include"SpiralTest.h" 
#include<iostream> 

using namespace eveready; 


void TNotes::meth() 
{ 
    std::cout<<"inside meth"; 
} 

abc.cpp

#include "SpiralTest.h" 

using namespace eveready; 

int main() 
{ 
TNotes tell(0); 
tell.meth(); 

return 0; 
} 

Пожалуйста п ree, чтобы добавлять комментарии в случае любых запросов.

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

  • Нет связанных вопросов^_^