这是我在操作系统类中的任务的问题。我不是发布代码,而是一般怀疑。由于该项目是构建操作系统,因此没有调试工具。所以任何帮助都表示赞赏。
我有一个头文件,如下所示:
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文件中删除它并将其放在头文件中的私有变量下时,它编译得很好,但随后我的输出爆炸了。 任何指向我应该研究的内容。 (对不起,我知道很难知道上下文,但感谢您的帮助。)
答案 0 :(得分:2)
C ++文件中的静态变量很可能由编译器初始化为零。类成员变量绝对不会被初始化为任何东西。因此,请确保在类的所有构造函数中明确初始化它。
答案 1 :(得分:2)
如果您没有明确地执行此操作,则不会初始化POD成员。
全球化。那是因为没有extern
关键字的全局变量也在声明中定义。
你可以:
1)在构造函数中初始化变量:
test::test()
{
table = 0;
}
2)废弃这个:
或者,如果对象是动态创建的:
test* obj = new test();
而不是
test* obj = new test;
如果没有用户定义的构造函数,则前一版本会初始化POD成员。
答案 2 :(得分:1)
table
是否应该在test
的所有实例之间共享,或者您是否希望每个类实例有一个实例(当没有实例时为零实例)。您必须开始的语义导致在test
的所有实例之间共享一个实例。要使用成员变量来获取它,必须在类定义中声明它static
,并在其中一个源文件中定义它。
答案 3 :(得分:1)
“another_value”应该代表一个神奇的数字还是另一个可变的?首先,您应该在定义所有基元时为其分配初始值。不要使用幻数,使用#define ANOTHER_VALUE 0,如果是这种情况。
当我从C文件中删除它并将其放在头文件中的私有变量下时,它编译得很好但是我的输出会爆炸。
可能是因为你需要extern“C”他们变量,如果你从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;
请务必取消引用该值的指针:
eTest::eTest() {
m_test=&global_table;
}
void eTest::testValue() {
printf("Global C Value: %lu \n", global_table);
cout << "Test global value: " << *m_test << endl;
}