2012-03-15 4 views
-2

이것은 내 운영 체제 클래스에서 제 질문에 대한 w.r.t입니다. 나는 코드를 게시하지 않지만 일반적인 의심을 묻습니다. 이 프로젝트는 OS를 구축하기위한 것이므로 디버깅 도구가 없습니다. 그래서 어떤 도움을 주셔서 감사합니다.C++ 개인 변수 혼동

class test { 

private: 
    unsigned long base_address; 
    unsigned long size; 

public: 
    test(); 
    void method1(); 
    void method2(); 

}; 

해당 C 파일은 다음과 같습니다 :

나는 다음과 같다 헤더 파일이

#include "test.H" 

unsigned long table;  

test::test(){ 
    base_address = some_value; //initialise the variables 
    size = some_other_value; 
    table = another_value; 
    //some code 
} 

void test::method1(){ 
    //some code 
} 

void test::method2(){ 
    //some code 
} 

이 코드는 잘 작동을하고, 내가 원하는 출력을 얻을. 내 문제는 클래스 변수로 "테이블"(현재 C 파일의 모든 함수에서 선언 및 사용됨) 변수를 만들고 싶다는 것입니다. C 파일에서 제거하고 헤더 파일의 개인 변수 아래에 넣으면 잘 컴파일되지만 내 출력은 폭발적입니다. 내가 조사해야 할 부분에 대한 안내.? (미안 컨텍스트를 알지 못한다는 것을 알고 있지만 도움을 주셔서 감사합니다.)

+1

예를 들어 사용중인 코드를 수정하십시오! 그 선언 생성자()는 테스트 클래스의 멤버가 아닌 **입니다. 이 예제는 전혀 컴파일하지 않아야합니다. –

+0

테스트 메소드를 전역 메소드로 구현 한 이유는 무엇입니까? 클래스의 private 멤버는 액세스 할 수 없습니다 (컴파일 방법이 궁금합니다). 어쩌면 당신의 예제가 실제 코드와 너무 멀리 떨어져있을 수도 있습니다. –

+0

옳고 그른 대답을하기에 충분히 구체적인 질문은하지 않으므로 여기에 속한 것은 아닙니다. – Omnifarious

답변

1

"another_value"는 매직 넘버 또는 다른 vaiable을 나타내는 것으로되어 있습니까? 먼저, 모든 프리미티브를 정의 할 때 초기 값을 할당해야합니다. #define ANOTHER_VALUE 0을 사용하면 마술 숫자를 사용하지 마십시오.

:

여기

How do I use extern to share variables between source files?

은 컴파일 예 : 당신이 C 코드에서 사용하기 위해의 프로토 타입에 당기는 경우, 그들은 변수 "C"를 통근 할 필요가 아마 때문에

When I remove it from the C file and put it under the private variables in the header file, it compiles fine but then my output blows up.

extern Testestpp 2000

//============================================================================ 
// Name  : externTest.cpp 
// Author  : 
// Version  : 
//============================================================================ 
#include <stdio.h> 
#include <stdlib.h> 
#include <iostream> 
#include "externTest.hpp" 

extern "C" { 
#include "value.h" 
} 

using namespace std; 

eTest::eTest() { 
    m_test=global_table; 
} 

void eTest::testValue() { 
    printf("Global C Value: %lu \n", global_table); 
    cout << "Test global value: " << m_test << endl; 
} 

value.h

/* 
* value.h 
* 
* Created on: Mar 15, 2012 
*/ 

#ifndef VALUE_H_ 
#define VALUE_H_ 

extern unsigned long global_table; 

void assign_value(unsigned long lValue); 

void print_global_value(); 

#endif /* VALUE_H_ */ 

value.c

/* 
* value.c 
* 
* Created on: Mar 15, 2012 
*/ 

#include "value.h" 

unsigned long global_table; 

void assign_value(unsigned long lValue) { 
    global_table=lValue; 
} 

void print_global_value() { 
    printf("Global C Value: %lu \n", global_table); 
} 

당신은 테이블의 물리적 주소를 사용하려면, 단지 포인터가 global_table하는 M_TEST합니다

private: 
    unsigned long *m_test; 

poi를 참조 해제해야합니다. 값을 입력하십시오 :

eTest::eTest() { 
    m_test=&global_table; 
} 

void eTest::testValue() { 
    printf("Global C Value: %lu \n", global_table); 
    cout << "Test global value: " << *m_test << endl; 
} 
+0

another_value는 숫자가 아닌 변수입니다. 헤더 파일에서 extern이라는 테이블을 선언하면 "test :"에 대해 지정된 오류 : 저장소 클래스가 생겨서 세미콜론이 누락되지 않습니다. 그래도 도움을 주셔서 감사합니다. – rgamber

+0

예보기 -^ –

+0

자세한 설명 주셔서 감사합니다! 도움에 정말 감사드립니다. – rgamber

2

C++ 파일의 정적 변수는 대부분 컴파일러에서 0으로 초기화됩니다. 클래스 멤버 변수는 가장 명확하게 초기화되지 않습니다. 클래스의 모든 생성자에서 명시 적으로 초기화하고 있는지 확인하십시오.

+0

생성자에서 초기화 중입니다. 나는 그렇게 말 했어야했다. 나는 그 말을 편집 할 것이다. – rgamber

2

명시 적으로 POD 멤버를 초기화하지 않으면 초기화되지 않습니다.

전체입니다. extern 키워드가없는 전역 변수도 선언에 정의되어 있기 때문입니다.

다음 중 하나를 수행 할 수 있습니다 :

1) 생성자에서 변수 초기화 :

test::test() 
{ 
    table = 0; 
} 

2) 스크랩을이 하나

또는 개체가 동적으로 생성되는 경우 :

test* obj = new test(); 

대신

test* obj = new test; 

이전 버전에서는 사용자 정의 생성자가없는 경우 POD 구성원을 초기화합니다.

+0

전자는 사용자 정의 생성자가없는 경우에만 POD 멤버를 초기화합니다. –

+0

@James 나는 그것을 몰랐다. 확실한가요? –

+0

예, 사용자 정의 생성자가있는 경우 컴파일러에서 기본 생성자를 생성하지 않으며 사용자 정의 기본 생성자에 아무 것도 추가하지 않습니다. –

1

모든 인스턴스가 test 인 경우이 공유되거나 클래스 인스턴스 당 하나의 인스턴스 (인스턴스가없는 경우 제로 인스턴스)를 원하십니까? 당신이 시작해야만하는 의미론은 하나의 인스턴스가 test의 모든 인스턴스들 사이에서 공유되는 결과를 낳습니다. 이를 멤버 변수와 함께 얻으려면 클래스 정의에서 static을 선언하고 소스 파일 중 하나에서 정의해야합니다.

+0

네, 지금 말했듯이 모든 테스트 인스턴스 사이에 하나의 테이블 복사본이 있습니다. 테스트 인스턴스 하나당 하나의 테이블 인스턴스가 필요했습니다. 따라서 나는 정적 인 것을 원하지 않는다. – rgamber

+0

@rgamber 그런 다음 다른 포스터에서 언급 한 것처럼 초기화에 누락 된 것일 수 있습니다. –