2013-04-23 6 views
1

일부 클래스 메소드를 넣어 나는 하나의 .H 및 .CC 파일에 포함 된 다음과 같은 형식의 코드의 비트 :다른 .CC 파일

에서 MyClass.h :

#ifndef MYCLASS_H 
#define MYCLASS_H 
class myClass 
{ 
public: 
    myClass(); // constructor 
    ~myClass(); // destructor 

    void classMethod1(); 
    void classMethod2(); 

    int memberVarable1; 
    int memberVariable2; 
}; 
#endif 

및 myClass가 .cc :

#include "myClass.h" 
myClass::myClass(){ 
// stuff 
} 

myClass::~myClass(){ 
// stuff 
} 

void myClass::classMethod1(){ 
// stuff 
} 

void myClass::classMethod2(){ 
// stuff 
} 

이 모든 것이 정상적으로 작동합니다. 그러나 내 프로젝트가 상당히 커지고 새로운 기능을 추가하려고합니다. myClass.h와 myClass.cc를 막히는 대신에 새로운 메소드를 다른 .cc 파일에 넣기를 원합니다. 나는 이것을 작동시킬 수있는 것 같지 않습니다.

에서 MyClass.h :

#ifndef MYCLASS_H 
#define MYCLASS_H 

#include "secondFile.h" 

class myClass 
    { 
    public: 
     myClass(); // constructor 
     ~myClass(); // destructor 

     void classMethod1(); 
     void classMethod2(); 

     int memberVarable1; 
     int memberVariable2; 
    }; 
#endif 

및 myClass.cc :

#include "myClass.h" 
#include "secondFile.h" 
myClass::myClass(){ 
// stuff 
} 

myClass::~myClass(){ 
// stuff 
} 

void myClass::classMethod1(){ 
// stuff 
} 

void myClass::classMethod2(){ 
// stuff 
} 

secondFile.h :

#ifndef SECONDFILE_H 
#define SECONDFILE_H 

void someNewMethod(); 

#endif 

secondFile.cc

#include "secondFile.h" 
void someNewMethod(){ 
// can't see classMethod1() 
} 
+1

다음과 같이 정의합니다 무효 myClass가 :: classMethod1을() { // 물건 } 무효 myClass가 :: classMethod2() { // 물건 } 내가 문제를 많이 볼 수 있습니다 –

+0

, 그러나 나는 그 문제들 중 많은 부분이 당신의 실제 코드에 없다고 확신한다. 당신이 진짜 코드를이 포스트에 옮겨 적어 놓은 실수 일 뿐이다. 따라서 실제 코드와 비슷하게 게시물을 수정하십시오. 그렇지 않으면 당신은 당신의 실제 문제와 아무런 관련이없는 해답을 얻을 것입니다. – john

+0

또한 makefile을 사용하고 있습니까? –

답변

3

모든 소스 파일에서 사용할 함수 등을 선언하는 모든 헤더 파일을 포함해야합니다. 당신이 secondFile.cc이 무슨 일을하는 것은 실제로 수행하는 것은 매우 일반적입니다 BTW,

#include "myClass.h" 
#include "secondFile.h" 
void someNewMethod(){ 
// can't see classMethod1() 
} 

을 포함시킬처럼

그래서 귀하의 경우, 그것은 보인다. 때로는 내가 제안한 것 이상으로 나아가고, 여러 소스 파일에서 단일 클래스의 다양한 메소드를 구현합니다. 크고 복잡한 클래스의 경우 약간의 변경 만 수행하면 클래스 구현의 일부만 다시 컴파일하면되기 때문에 개발주기를 단축 할 수 있습니다. 예 :

에서 MyClass.h

#pragma once 

class MyClass 
{ 
    ... 
    void complicatedMethod0(); 
    void complicatedMethod1(); 
    ... 
}; 

myclass_impl0.cpp

#include "myclass.h" 

void MyClass::complicatedMethod0() 
{ 
    ... 
} 

myclass_impl1.cpp 당신이 "myClass가를 포함 잊어 버린 것 같다

#include "myclass.h" 

void MyCLass::complicatedMethod1() 
{ 
    ... 
} 
+0

좋아요! secondFile.h에 메서드 선언을 넣거나 myClass.h에 모든 것을 유지할 수 있습니까? – tir38

+0

@ tir38 그게 달려 있습니다. 클래스에 메서드를 추가하는 경우 동일한 헤더 파일을 사용해야합니다. 여러 헤더 파일에 클래스 선언을 전파 할 수 없습니다. 그렇지 않으면 무엇이 가장 잘 작동하는지 확인하십시오. –

+0

* "모든 소스 파일에서 사용할 함수 등을 정의하는 모든 헤더 파일을 포함시켜야합니다."* -이 것은 사실이 아니며 함수 선언 만 필요합니다. 정의를 찾는 것이 링커의 작업입니다. 그들은 헤더 파일에있을 필요도 없으며 선언을 전달할 수 있습니다. – JBentley

0
#include "secondFile.h" 
#include "myClass.h" 
//if you want the class methods, 
//you need to tell the compiler where to look 
void someNewMethod(){ 
// can't see classMethod1() 
} 

. h ".

1

의 경우 myClass 개의 메소드를 추가하면 그렇게 할 수 없습니다. 클래스 메소드는 하나의 정의에 포함되어야합니다.

당신은 그것에서을 상속 에 의해, 그러나,myClass 확장 할 수

secondFile.h을 :

#ifndef SECONDFILE_H 
#define SECONDFILE_H 

#include "myClass.h" 

class mySecondClass : public myClass 
{ 
    public: 
     void someNewMethod(); 
} 
#endif 

두 번째 파일을.CC

#include "secondFile.h" 
void mySecondClass::someNewMethod(){ 
    this.classMethod1(); 
} 
+0

이렇게하면 myClass의 한 인스턴스에서 mySecondClass 인스턴스를 하나 만들 수 있습니다. 그런 다음 mySecondclass 인스턴스는 myClass 인스턴스의 모든 공개 및 보호 된 (개인이 아닌) 메소드 및 변수를 알고 있습니까? – tir38

+1

아니, 같은 경우입니다. 그것은 모두 mySecondClass와 myClass입니다. 같은 방식으로 기린은 포유 동물과 동물입니다. 더 나은 이해를 얻으려면 상속에 대해 읽어보십시오. –