2012-03-15 123 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 
} 

此代碼工作正常,我也得到所需的輸出。我的問題是我想將變量「table」(當前在C文件中的所有函數中聲明和使用)作爲類變量。當我從C文件中刪除它並將其放在頭文件中的私有變量下時,它編譯得很好,但是輸出結果正常。 任何指向我應該看的東西。 (對不起,我知道它很難不知道上下文,但感謝您的幫助。)

+1

請修正您使用的代碼爲例!使用該聲明構造函數()是**不是**測試類的成員。這個例子根本不應該編譯。 – 2012-03-15 17:53:08

+0

爲什麼您將測試方法實施爲全局方法?他們不能訪問一個類的私有成員(我想知道它是如何編譯的)。也許你的例子離真正的代碼太遠了。 – 2012-03-15 17:38:25

+0

這不屬於這裏,因爲你沒有提出足夠具體的問題來解答正確或錯誤的答案。 – Omnifarious 2012-03-15 17:57:57

回答

1

「another_value」應該表示一個幻數還是另一個可變值?首先,您應該在定義所有基元時指定一個初始值。不要使用幻數,如果是這種情況,請使用#define ANOTHER_VALUE 0。

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 「C」,他們的變量,如果你是在protoype拉動使用從C代碼:

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

這裏有一個編譯例如:

externTest.hpp

/* 
* externTest.hpp 
* 
* Created on: Mar 15, 2012 
*/ 

#ifndef EXTERNTEST_HPP_ 
#define EXTERNTEST_HPP_ 

class eTest 
{ 
private: 
    unsigned long m_test; 

public: 
    eTest(); 

    void testValue(); 
}; 


#endif /* EXTERNTEST_HPP_ */ 

externTest.cpp

//============================================================================ 
// 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); 
} 

如果你想使用表的物理地址,只是讓m_test指針global_table:

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是一個變量,而不是一個數字。當我在頭文件中聲明table爲extern時,我得到「error:爲'test'」指定的存儲類,並且沒有分號丟失。感謝您的幫助。 – rgamber 2012-03-15 18:10:39

+0

查看示例 -^ – 2012-03-15 20:26:44

+0

感謝您的詳細解釋!我非常感謝幫助。 – rgamber 2012-03-16 01:45:59

2

C++文件中的靜態變量很可能會被編譯器初始化爲零。一個類成員變量絕對不會被初始化爲任何東西。所以確保你在類的所有構造函數中明確地初始化它。

+0

我在構造函數中初始化它。我應該說的。我將編輯帖子來說出這樣的話。 – rgamber 2012-03-15 17:40:23

2

如果不明確地執行POD成員,則不會進行初始化。

Globals are。這是因爲在聲明中也定義了沒有extern關鍵字的全局變量。

您可以:

1)初始化在構造函數中的變量:

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

2)的廢料這一個:

或者,如果該對象是動態創建的:

test* obj = new test(); 

而不是

test* obj = new test; 

如果沒有用戶定義的構造函數,則前一版本將初始化POD成員。

+0

如果沒有用戶定義的構造函數,前者只會初始化POD成員。 – 2012-03-15 17:58:21

+0

@詹姆斯我不知道。你確定? – 2012-03-15 18:00:50

+0

是的,如果用戶定義的構造函數存在,編譯器將不會生成默認構造函數,也不會向用戶定義的默認構造函數中添加任何內容。 – 2012-03-15 18:07:38

1

table應該在test的所有實例之間共享,還是每個類實例需要一個實例(當沒有實例時爲零)。您必須開始的語義會導致在test的所有實例之間共享一個實例。爲了得到這個成員變量,有必要在類定義中聲明它static,並在其中一個源文件中定義它。

+0

是的,正如你現在所說的,我在所有的測試實例之間都有一個表副本。我希望每個測試實例都有一個表實例。因此我不想要一個靜態的。 – rgamber 2012-03-15 17:44:09

+0

@rgamber然後問題可能是缺少初始化,正如其他海報所述。 – 2012-03-15 17:46:57