【问题标题】:Initialising a constant string in a constructor? C++在构造函数中初始化常量字符串? C++
【发布时间】:2017-12-11 01:56:11
【问题描述】:
//Person declaration
Class Person {
    public:
        Person();
        const String getName() const;
    private:
        const String name;
};

//Person definition
    #include "Person.h"
    Player::Player() {
    cout << "Enter name: ";
    cin >> name;
}

如果我想在创建类时初始化人名,使用默认构造函数和初始化列表,但 name_ 是 const 的约束,我该怎么做?

我不相信 name 的 init 列表会起作用,因为据我所知,init 列表会在创建时设置值,并且 name 是一个 const ,此时它不再是可修改的。

所以假设我创建了一个 Person();在另一个类中,如何在该类实例的生命周期内最初将它们的名称设置为 const?

【问题讨论】:

  • 我不会在构造函数中std::cin &gt;&gt; name;
  • “我不相信名称的初始化列表会起作用”它会:)。
  • 快速反应的家伙!谢谢@Galik,作为另一种设置名称的方法,你会推荐什么,另一个限制是我不能使用 setter。
  • @George,您能否澄清一下初始化列表如何为此工作?我试过 Player() : name(n) { cin >> n; } 等,但我不确定这是否是正确的方法。
  • 查看@The Aspiring Hacker 的回答。你可以使用构造函数的初始化列表。

标签: c++ string constructor constants


【解决方案1】:

不要在构造函数中提示输入。将 IO 移到函数之外,并使构造函数将字符串作为参数。然后,将字符串从用户传递给构造函数。

class Person {
public:
    Person(const std::string& name)
      : name_(name) {}
    const std::string& getName() const { return name_; }
private:
    const std::string name_;
};

...

std::string name;
std::cin >> name;
Person person(name);

【讨论】:

  • 完美,谢谢!作为说明,在构造函数中使用 IO 有什么不好?
  • 随着程序变得越来越大,最好将类视为模块化 API 以供其他代码调用,而不是将它们与获取输入等应用程序方面交织在一起。例如,如果您想创建一个不通过用户提供名称的Person 对象怎么办?
  • @casperf1 刚性,以及您无法从其类的 ctor 控制范围初始化 const 成员的事实。
  • 这是有道理的。非常感谢您的支持。假设我想在另一个类中初始化一个播放器对象,并在仍然使用这个构造函数的同时访问它的方法。我可以从 OtherClass.cpp/.h 调用构造函数吗?
  • @casperf1 如果您按原样使用您的构造,那么当您从 OtherClass.cpp 创建播放器对象时,将提示用户输入。
【解决方案2】:

你可以调用一个函数作为初始化器:

std::string get_name() {
    std::cout << "Name: ";
    std::string nm;
    std::cin >> nm;
    return nm;
}

Person::Person() : name(get_name()) {
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多