2014-09-18 2 views
-2

저는 간단한 문제가 있다고 생각합니다. 하지만 C++ 프로그래밍에 익숙하지 않은 지금은 해결할 수 없습니다. 나는 원래의 코드가 훨씬 더 길기 때문에 가능한 한 짧고 간단한 코드를 만들기 위해 새로운 C++ 프로젝트를 만들었습니다. 문제는 그대로 유지했습니다. Stackoverflow와 Google을 검색하여 약 50 건의 관련 문제를 읽었으나 지금까지 해결할 수있는 방법이 없습니다. 하나의 cc와 하나의 h 파일에 모든 것을 넣는 것은 효과가 있지만 내가 선호하는 것이 아닙니다. 도움에 미리 감사드립니다.클래스를 사용하는 동안 연결하는 동안 단순한 C++ 정의되지 않은 참조 오류가 발생했습니다.

나는 우분투 14.04/코드 : 블록 13.12/GCC와 g ++ 4.8.2

문제를 사용하고 내가 때문에 (다른 파일에 정의 된 클래스의 내부 및 컴파일 작업하는 동안 기능에 액세스 할 것입니다 file1.h의 extern에) 연결이 실패합니다. 방금 "Simple S1;"을 입력하면 대신 "extern Simple S1;" file1.h 및 file1.cc에서 제거 할 여러 선언 오류가 예상됩니다. 분명히 "extern"트릭은 클래스에서 작동하지 않지만 변수와 함께 잘 작동합니다.

file1.h :

#ifndef FILE1_H 
#define FILE1_H 

class Simple 
{ 
    private: 
    unsigned int length = 10; 

    public: 
    void SetLength(unsigned int l) {length = l;} 
    unsigned int GetLength() {return length;} 
}; 

extern Simple S1; 

#endif 

file1.cc :

#include <iostream> 
#include "file1.h" 
#include "file2.h" 

int main() 
{ 
    Simple S1; 
    unsigned int l = GetL(); 
    std::cout << "length=" << l << "\n"; 
    l = 20; 
    l = GetL(); 
    std::cout << "length=" << l << "\n"; 
    return 0; 
} 

file2.h :

#ifndef FILE2_H 
#define FILE2_H 

unsigned int GetL(); 

#endif 

file2.cc :

#include "file1.h" 
#include "file2.h" 

unsigned int GetL() 
{ 
    return S1.GetLength(); 
} 

명령 에러를 구축 :

g++ -std=c++11 -Wall -fexceptions -g -c file1.cc -o obj/Debug/file1.o 
g++ -std=c++11 -Wall -fexceptions -g -c file2.cc -o obj/Debug/file2.o 
g++ -o bin/Debug/Test obj/Debug/file1.o obj/Debug/file2.o 
obj/Debug/file2.o: In function `GetL()': 
file2.cc:6: undefined reference to `S1' 
collect2: error: ld returned 1 exit status 

답변

0

S1이 아닌 메인 내부 전역에 정의되어야 글로벌 경우() 함수에 해당 지역의 새로운 인스턴스를 생성한다.

main() 앞에 Simple S1;을 넣습니다.

#include <iostream> 
#include "file1.h" 
#include "file2.h" 

Simple S1; 

int main() 
{ 
    unsigned int l = GetL(); 
    std::cout << "length=" << l << "\n"; 
    l = 20; 
    l = GetL(); 
    std::cout << "length=" << l << "\n"; 
    return 0; 
} 
+0

감사를하는 I 이 명백한 것을 보지 못했습니다. – WillemB

+0

그리고 나는 다른 대답보다 1 분 앞서 있었지만 당신은 다른 하나를 accpeted했다. – CashCow

+0

미안해, 내 질문을 확인한 후에 다른 것을 먼저 나열했다. 빨리 와우라는 대답을받을 것이라고 생각하지 않았습니다. 나는 당신에게 두 학점을 모두 나누는 것을 선호하지만 인정 된 대답을 수정했습니다. – WillemB

0
extern Simple S1; 

이 선언은 코드에서 다른 곳 형 Simple의 전역 객체 S1이 약속합니다. 그러나 그런 대상을 결코 정의하지 마십시오. "가까운"것은 로컬 변수 S1main() 안에 있지만, 물론 완전히 다른 것입니다.

그래서 단지 main()S1 외부의 정의를 이동 : 그래서 난 그냥 코드에 추가 학급 전체의 일에 집중하고, 놀라운 빠르고 정확한 응답을 너무

Simple S1; 

int main() 
{ 
    unsigned int l = GetL(); 
    std::cout << "length=" << l << "\n"; 
    l = 20; 
    l = GetL(); 
    std::cout << "length=" << l << "\n"; 
    return 0; 
} 
+0

믿을 수없는 빠르고 정확한 응답에 대해 와줘서 고맙습니다. 코드에 추가 한 전체 클래스에 너무 집중했습니다. – WillemB