c ++函数范围

时间:2010-05-01 15:27:27

标签: c++ scope

我在A.cpp中有一个主要功能,它具有以下相关的两行代码:

B definition(input_file);
definition.Print();   

B.h中,我有以下相关的代码行:

class B
 {
   public:
     // Constructors
     B(void);                                                    
     B(const char *filename);
     ~B(void);

     // File input
     int ParseLSFile(const char *filename);

     // Debugging
     void Print(void);

     // Data
     int var1; 
     double var2;   
     vector<char* > var3;   
     map<char*, vector<char* > > var4; 
}

B.cpp中,我有以下功能签名(抱歉是多余的):

B::B(void)
  : var1(-1),
    var2(numeric_limits<double>::infinity())
{
}

B::B(const char *filename)
{
  B *def = new B();
  def->ParseLSFile(filename);
}

B::~B(void)
{
  // Free memory for var3 and var 4
}

int B::ParseLSFile(const char *filename)
{
  // assign var1, var2, var3, and var4 values
}

void B::Print(void)
{
  // print contents of var1, var2, var3, and var4 to stdout
}

因此,当我从Print()内调用B::ParseLSFile(...)时,我的结构内容会正确打印到stdout。但是,当我从A.cpp调用definition.Print()时,我的结构是空的或包含垃圾。任何人都可以推荐正确的方法来初始化/传递我的结构,以便我可以在我的函数定义范围之外访问它们吗?

感谢。

2 个答案:

答案 0 :(得分:3)

而不是制作

B *def = new B();
def->ParseLSFile(filename);

在你的构造函数中你应该写

ParseLSFile(filename);

这意味着您将使用ParseLSFile函数初始化当前对象成员。您可以将该函数命名为InitFromFile以保留一些命名逻辑。

然后您的代码将转换为:

B object_name(filename);
object_name.Print();

和(不完全一样,但只是为了让你理解潜在的机制)这意味着像

Create empty object of type B
Initialize it from file using InitFromFile()
Call Print() to display the contents of this object

答案 1 :(得分:2)

在采用const char*的构造函数中,您动态创建该类的另一个实例,并使用它而不是当前实例。而不是

B *def = new B();
def->ParseLSFile(filename);

你需要打电话

ParseLSFile(filename);

这样您就可以对正在构造的对象进行操作。就像现在一样,你有资源泄漏。

在不相关的注释中,您不应该使用指针作为地图键。就像现在一样,通过键访问元素几乎是不可能的,因为只进行指针比较; char*指向的字符串值将不会被比较。您应该使用std::string作为密钥类型。