【问题标题】:vector of pointers to class objects指向类对象的指针向量
【发布时间】:2019-06-07 19:49:14
【问题描述】:

我在理解指向类对象的指针向量时遇到问题,我尝试了一个测试代码来尝试理解它,但是每当我输入一个名称并尝试输出它时,它会打印出数字而不是我的实际名称进入。我希望有人可以向我解释这一点,因为我是这些概念的新手。

还有 Pets[0]->print(); dosent 一直打印:

cout << "in main: " << Pets[0] << endl; 

打印。

class Pet
{ 
public:
    string name;
    Pet(const string&);

    string getName() const
    {
        return name;
    }
    void setName(const string& Name)
    {
        name = Name;
    }
    void print()const;
}

int main()
{
    vector<Pet*> Pets;
    string names;
    int done = NULL;
    do
    {
        {
            cout << "Name: ";
            cin >> names;
            Pets.push_back(new Pet(names));
            cin.ignore();
        }
        cout << "Add another ?" << endl;
        cin >> done;
    } while (done != 0);

    Pets[0]->print();
    cout << "in main: " << Pets[0] << endl;
    system("pause");
}
Pet::Pet(const string& Name)
{
}
void Pet::print()const
{
    cout << "Name: " << name;
}

【问题讨论】:

  • @Yksisarvinen std::string 有一个默认构造函数,它创建一个空字符串,所以这不是 UB。
  • Pets[0]-&gt;print(); 会打印,但会打印一个空字符串。您忘记在类构造函数中初始化 name 成员,因此它默认初始化为空字符串。
  • @aschepler 你是对的,我的错。
  • 请注意,通常您会使用std::vector&lt;Pet&gt;,即没有指针,并依靠向量为您管理内存。在您的代码中,您有内存泄漏,因为所有 newed 也应该是 deleted

标签: c++ class object pointers stdvector


【解决方案1】:

Pet 的构造函数没有赋值,所以它保持为空。

写...

Pet::Pet(const string& Name) : name(Name) { }

进行初始化。

【讨论】:

  • 会 ``` Pet::Pet(const string& Name) { name = Name; } ``` 一样吗?我为什么要使用 : 部分?对不起,我很新,而且要自学
  • 在这种情况下,它实际上是一样的; :-notation 是初始化,而正文中的 name = Name 是赋值。有些事情,例如初始化const 类型的成员,只允许通过初始化而不是通过赋值。但是 - 如前所述 - 在你的情况下它并没有太大的区别。
  • @Luminate 您要么必须将{ this-&gt;name = Name; } 放在构造函数的主体中,要么将: name(Name) 放在成员初始化列表中。由你决定。
  • 非常感谢,已经解决了。简单的事情,当我可以在几分钟内问到这里时,我寻找了一个小时的答案。
猜你喜欢
  • 1970-01-01
  • 2023-02-09
  • 1970-01-01
  • 2011-10-01
  • 2021-05-20
  • 2011-02-11
  • 2010-12-20
  • 2016-04-30
  • 2020-04-03
相关资源
最近更新 更多