2012-03-15 106 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