【问题标题】:Using same variable in two functions在两个函数中使用相同的变量
【发布时间】:2013-05-07 11:15:26
【问题描述】:

我有两个函数read()write()。我在read() 函数中读取了一个文件,并将一行存储在一个变量的标题中。现在我希望write() 函数将同一行写入新文件。但是我怎样才能使用来自其他函数的相同变量或信息呢?这样做的方法是什么?

以下是有关代码的一些信息:

包含必要的文件后,它会这样说

HX_INIT_CLASS(HxCluster,HxVertexSet);

类的名称是 HxCluster,如果有人能告诉我为什么不像我们以简单的方式定义类,那就太好了:class class_name {};

我有很多函数,其中两个是read()write()。它们都只接受一个参数,即在各自情况下要读取的文件和要写入的文件。我不知道为此编写代码是否会有所帮助。

【问题讨论】:

  • 您真的应该考虑reading a good book or two - 从您的问题来看,您似乎还没有完全掌握基础知识。
  • @ChrisF 使用全局变量几乎从来都不是正确的答案。您为什么要向显然需要一些基础知识帮助的人推荐它?
  • @PeterWood - 是的。我会编辑评论。
  • @detraveller:查看您的 HxCluster.H 或 HxCluster.HPP 文件,您可能会找到“class HxCluster {}”。我认为 HX_INIT_CLASS 宏仅用于 CPP 文件。
  • 此外,当 HX_INIT_CLASS 弹出时,可能值得说一下您在使用哪些库。目前对我来说它看起来像 Amira (msi.umn.edu/~esevre/amira/dev/compmodule1.html)

标签: c++ function


【解决方案1】:

如果我理解你的话,这正是 C++ 中结构/类/对象的用途。例如:

class FileLineWriter
{
public:
    FileLineWriter();

    void read(istream& inputfile);
    void write(ostream& putfile);

private:
    string line_of_text;
};

void FileLineWriter::read(istream& s)
{
    // s >> this->line_of_text; // possible, but probably will not do what you think
    getline(s, this->line_of_text);
}

void FileLineWriter::read(ostream& s)
{
    s << this->line_of_text;
}

...
FileLineWriter writer;
writer.read(firstfile);
writer.write(secondfile);

请注意,以上不是工作代码。这只是一个样本。您必须修复所有拼写错误、缺少的命名空间、标题、添加流打开/关闭/错误处理等。

【讨论】:

  • 当然,我写的所有内容都假设您可以将读/写函数更改为对象的方法。如果你不能这样做(即 read()/write() 必须保持“无对象”普通函数),那么返回一行(普通返回或通过 ref/pointer 参数)或 using-somekindof-globalvariable 是唯一的选项。
【解决方案2】:

您从读取返回变量并将其作为参数传递给写入。像这样的

std::string read()
{
   std::string header = ...
   return header;
}

void write(std::string header)
{
   ...
}

std::string header = read();
write(header);

在函数之间传递信息是一项需要学习的基本 C++ 技能。

【讨论】:

  • 是的,但在我的情况下,传递参数是没有问题的,因为该函数只能接受一个参数,即读/写文件的名称。
  • 好吧,在这种情况下,看起来像 quetzalcoatl 的答案是最好的。
【解决方案3】:

如果我理解这一点,那么我建议您将变量上的信息保存为字符串或整数,具体取决于它是什么类型的信息。

我还建议始终包含一些代码,以便我们能够为您提供更多帮助

【讨论】:

    【解决方案4】:

    您可以让 write 接受一个参数,void write(std::string text),或者您可以将您读取的字符串作为全局变量 std::string text 存储在您的 .cpp 文件顶部,text = ... 在您的读取函数中(替换 .. . 使用 ifstream 或您使用的任何东西),然后在您的写入函数中写入text

    【讨论】:

    • 这正是我认为应该有效的。我试过了,但没有。让我再试一次,如果这不起作用,我将返回代码。谢谢
    • -1 建议使用全局变量。这几乎总是一个非常糟糕的想法。
    • 是的,这就是为什么我建议首先使用函数参数。我仍然认为应该向他提供所有信息,以便他自己选择。
    • 我不同意。编写糟糕但有效的代码始终是一种选择,但不应向任何人(尤其是初学者)建议以避免养成不良习惯。在 C 中,您可能建议使用全局变量。在 C++ 中,这几乎总是一个糟糕的想法。
    【解决方案5】:

    当然, 使用指针!

    void main(){
      char* line = malloc(100*sizeof(char));
      read_function (line);
      write_function (line);
    }
    
    void read_function(char* line){
      .... read a line
      strcpy (line, the_line_you_read_from_file);
    }
    
    void write_function (char* line){
      fprintf (fp,"%s", line);
    }
    

    【讨论】:

    • 除了malloc而不使用string,还要注意即使在C语言中你也可以返回指针甚至结构之类的东西,而且你通常不想盲目地假设一行会不超过 X 个字符。
    • @Spook 只要带有全局变量的解决方案不会泄漏内存(就像这个一样),我什至更喜欢带有全局变量的解决方案。
    猜你喜欢
    • 2018-01-01
    • 1970-01-01
    • 2021-10-01
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-13
    • 2019-02-11
    相关资源
    最近更新 更多