我在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()
时,我的结构是空的或包含垃圾。任何人都可以推荐正确的方法来初始化/传递我的结构,以便我可以在我的函数定义范围之外访问它们吗?
感谢。
答案 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
作为密钥类型。