【问题标题】:c++ function scopec++ 函数作用域
【发布时间】:2010-05-01 15:27:27
【问题描述】:

我在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
}

所以当我从B::ParseLSFile(...) 中调用Print() 时,我的结构的内容会正确打印到标准输出。但是,当我从 A.cpp 调用 definition.Print() 时,我的结构是空的或包含垃圾。谁能推荐初始化/传递我的结构的正确方法,以便我可以在函数定义范围之外访问它们?

谢谢。

【问题讨论】:

  • 无论您的代码中哪里有 char *,您都应该真正考虑使用 std::string - 特别是对于地图。

标签: c++ scope


【解决方案1】:

而不是制造

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

【讨论】:

  • 感谢函数名建议。我一直在想一个更好的方法来命名它,我喜欢你的。
【解决方案2】:

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

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

你只需要打电话

ParseLSFile(filename);

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

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

【讨论】:

    猜你喜欢
    • 2013-04-17
    • 1970-01-01
    • 2017-05-26
    • 2021-05-22
    • 2012-03-07
    • 1970-01-01
    • 2015-08-22
    • 1970-01-01
    相关资源
    最近更新 更多