2012-07-03 3 views
1

나는 전역 변수 (클래스의 객체)를 사용하고 다음과 같이 정의 :전역 변수를 정의하고 그 전역 변수를 초기화하는 것이 좋습니다.

//foo.h 
extern class_name obj_name; 
//foo.cpp 
class_name obj_name("directory of a .ttf file"); 

내가 내 main() 함수가있는 내 MAIN.CPP에서 foo.h 포함되어 있습니다.

문제는 함수 내부에 없기 때문에 거기에서 초기화하는 것이 쉽지 않다는 것입니다. 그것은 열려 있습니다. 나는 객체를 초기화하는 "init()"함수를 호출하는 것을 선호했을 것이다 :

object_name = class_name(parameters); 

main() 함수에서.

그러나 클래스는 제 3 자로 클래스 생성자에 매개 변수를 제공하지 않으면 생성되는 객체를 허용하지 않습니다. 어쩌면 기본 no-parameter 생성자가 없을 수도 있습니다.

위의 작업을 수행하는 것이 좋은 코딩 스타일입니까?

+0

당신은 이미 두 가지 답변 세트를 얻고 있습니다 : (1) "전역 접근 가능 객체를 사용하는 것이 좋은 코딩 스타일입니까?", (2) "전역 접근 가능 객체를 사용할 것이라면, 네임 스페이스 범위에서 이니셜 라이저로 정의 할 수있는 좋은 코딩 스타일 "을 제공합니다. 당신이 그 질문 중 하나에 대한 답변에만 관심이 있다면, 다른 질문에 대한 답변에 깊이 빠져들기 전에 지금 가장 잘 말하십시오. –

+0

실제로 두 질문에 대한 답변을 원합니다. – batman

답변

3

번호

아주 좋은 이유없이 C++에서 전역을 사용하지 마십시오.

  • "정적 초기화 순서 오류"가 발생합니다.
  • 추악한 스파게티 코드가 나옵니다.
  • 코드를 테스트하기가 어렵습니다.

글로벌이 타사 유형 인 경우 특히 그렇습니다.

게으른 초기화를 허용하는 팩토리 메소드와 같은 더 멋진 것을 사용하는 것을 고려하십시오. 또는 객체를 필요로하는 함수로 전달하십시오.

또한 제 3 자 클래스를 직접 포장하여 테스트하는 데 필요한 최소한의 인터페이스 만 제공하고 해당 추상 기본 클래스에 대한 포인터를 사용해야합니다. (또는 타사 라이브러리에서 지원하는 경우 - 제공하는 인터페이스 중 가장 사용하기 쉬운 인터페이스를 사용하십시오.)

+0

jrok이 작성한 것이 "공장 방법"입니까? – batman

1

전역 변수는 거의 항상 잘못된 값입니다. 그러나, 당신이 다른 옵션을 가지고 있지 않다면 (당신은?) 나는 포인터를 사용하도록 권유 할 것이다. 이렇게하면 전역 포인터를 원하는 위치에 정의 할 수 있으며 main 또는 다른 함수에서 연산자 new를 사용하여 전역 포인터를 초기화 할 수 있습니다. 그러나 이로 인해 개체를 수동으로 삭제해야합니다.

0

물론 좋은 코딩 스타일이 아닙니다. 하지만 모든 3 단 파티가 "올바른 방법"으로 만들어지지는 않으므로 규칙을 굴릴 상황이 있습니다. 당신이 그렇게한다면 적어도 은 그것을 설명 할 수 있습니다. 그래서 앞으로 왜 그렇게했는지 알게 될 것입니다.

3

Construct on first use idiom 당신을 저장할 수있는 몇 가지 걱정 :

// foo.h 

class_name& get_obj(); 

// foo.cpp 

class_name& get_obj() 
{ 
    static class_name obj("dir"); 
    return obj; 
} 

Another link.

+0

그래, 내가 전역 변수를 볼 수는 없지만,이 방법은 전역 변수를 사용하는 것과 동등한가? (동일한 주소가 프로그램 전체에서 액세스 가능하기 때문에). – batman

0

어쩌면 이런 일이 도움이 될 수 :

class ObjectFactory 
{ 
public: 
    static class_name* getObject() 
    { 
     if(ptr) 
      return ptr; 
     else 
     { 
      ptr = new class_name(<args>); 
      return ptr; 
     }     
    } 

private: 
    static class_name* ptr; 

    ObjectFactory() : ptr(NULL) {} 
} 

매번 당신이 항상 바로 할 수있는 개체를 사용합니다 :

class_name *p = ObjectFactory::getObject(); 
관련 문제