C ++私有变量混淆

时间:2012-03-15 17:33:58

标签: c++ global-variables private-members

这是我在操作系统类中的任务的问题。我不是发布代码,而是一般怀疑。由于该项目是构建操作系统,因此没有调试工具。所以任何帮助都表示赞赏。

我有一个头文件,如下所示:

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文件中删除它并将其放在头文件中的私有变量下时,它编译得很好,但随后我的输出爆炸了。 任何指向我应该研究的内容。 (对不起,我知道很难知道上下文,但感谢您的帮助。)

4 个答案:

答案 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;
}