【问题标题】:Why does this greet function not return the accepted value?为什么这个 greet 函数不返回接受的值?
【发布时间】:2016-07-29 05:14:06
【问题描述】:
#include <string>

struct Person
{
  Person(std::string name) {
  }

  std::string greet(std::string other_name)
  {
    name="Joe";
    return "Hi " + other_name + ", my name is " + name;
  }

  std::string name;
};

使用 greet 函数,我希望返回一个名称(例如 John),但是,正如它所写的那样,该函数什么也不返回。在“我的名字是”字符串之后是空白的。

如何在结构体中正确分配 name 的值,以便获得正确的返回值?

感谢您在正确方向上的任何推动!

【问题讨论】:

  • 不太清楚“正确”的返回值是什么。应该是Hi X my name is Joe 还是别的什么?我猜我会说您希望使用传递给构造函数的值?如果您包含一个小的 main 函数来显示如何使用 Person,它可能会使您的意图更加清晰。
  • 你使用什么编译器?对我来说,您的代码按预期工作。
  • 发布一个完整的程序(即调用函数的主程序)来演示问题!
  • 您在未显示的代码中有一个错误。您需要发布minimal reproducible example。我不明白这怎么能得到投票。
  • 抱歉,内容不够清晰。我正在处理的这个功能是在线交互式程序的一部分。 main在服务器端处理,我应该设计greet函数,这样调用的时候会显示一个问候语,格式为:“Hi other_name, my name is name” 不过我是个新手并且很少接触到数据结构的正确处理和设计。我相信我的问题与将名称值分配给结构中的其他内容有关,并在函数中调用该新分配。

标签: c++ function struct variable-assignment


【解决方案1】:

它不是从构造函数中的参数初始化名称字段。即将构造函数更改为:

 #include <string>

    struct Person
    {
      Person(std::string name) : name(name) {} {
    }

    std::string greet(std::string other_name)
    {
      return "Hi " + other_name + ", my name is " + name;
    }

    std::string name;
    };

这应该可以解决您的问题,并将返回所需的解决方案。

【讨论】:

    【解决方案2】:

    尝试使用断点?

    我使用 g++ 和 minGW 运行代码并得到相同的结果,然后将其更改为这个

    #include <iostream>
    #include <string>
    
    using std::string;
    
    struct Person
    {
      string name;
      Person(string _name) {
          name = _name;
      }
    
      string greet(string other_name)
      {
        return "Hi " + other_name + ", my name is " + name;
      }
    
    };
    
    int main()
    {
        Person person("foo");
        std::cout << person.greet("bar");
        return 0;
    }
    

    问题是名称为空,但编译器没有给出任何警告 这输出 "hello bar, my name is foo" ,我自己编译并得到了正确的结果

    【讨论】:

    • 快速更正:name 不为空。它是默认初始化的,对于std::string,这意味着一个空字符串。还有一点改进:Person(string _name): name(_name) {} 在进入构造函数的主体之前使用std::string 构造函数初始化namename = _name 在构造函数的主体中,name 可能首先被默认构造然后分配,基本上是做两个工作而不是一个。
    • 哇,断点...好吧,这似乎是我试图解决这个问题的问题。有人可以推荐一些新手资源来确保我理解这些“小事”吗?
    • 你回答了你自己的问题,一步一步来:) 对于断点,我使用 gdb 而不是专注于小事情,确保你首先了解基础知识
    【解决方案3】:
    #include <string>
    
    struct Person
    {
      Person(std::string _name) {
       name = _name;}
    
      std::string greet(std::string other_name)
      {
    
        return "Hi " + other_name + ", my name is " + name;
      }
    
      std::string name;
    };
    

    【讨论】:

    • 在你的答案中添加一些 cmets
    猜你喜欢
    • 2020-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-11
    • 1970-01-01
    相关资源
    最近更新 更多