C++ OOP,输出对象指针向量时的空白控制台,不确定填充向量是不是正确

Posted

技术标签:

【中文标题】C++ OOP,输出对象指针向量时的空白控制台,不确定填充向量是不是正确【英文标题】:C++ OOP, blank console when outputting vector of object pointers, unsure if populated vector correctlyC++ OOP,输出对象指针向量时的空白控制台,不确定填充向量是否正确 【发布时间】:2021-01-16 20:44:12 【问题描述】:

我有一个 csv 文件,我试图将信息存储在对象指针向量中。

我有一个 Item 类,它存储 csv 文件中的名称和价格。

class Item
    
    private:
       std::string name;
       float price;
    public:
       std::string getName()  return name; 
       float getPrice()  return price; 
       void setName(std::string newName)  name = newName; 
       void setPrice(float x)  price = x; 
    ;

我有一个函数可以更新该对象实例的字段

Item* addItem(const std::string& name, float price)
    
        Item* obj = new Item();
        obj->setName(name);
        obj->setPrice(price);
        items.push_back(obj);
        return obj;
    ;

主要代码:

全局向量

std::vector<Item*> items;
int main()

    // CSV file:
    //1 Nachos,4.99,
    //2 Buffalo wings,3.99,
    //  ...

    // Open file into data var
    std::ifstream data("menu.csv");
    // Store data in str
    std::string str;
    while (getline(data, str))
    
        std::istringstream iss(str);
        // values to collect
        std::string name, price;
        getline(iss, name, ',');
        getline(iss, price, ',');
        // push_back to items vector using class function
        addItem(name, std::stof(price));
    
    data.close();
    // output vector contents
    for (int i = 0; i < items.size(); i++)
    
        std::cout << items[i]->Item::getName() << items[i]->Item::getPrice() << std::endl;
    
    return 0;

我遇到的问题是,当我尝试输出代码时,我得到一个空白控制台,并且不确定问题出在向量的总体中还是与我尝试输出内容的方法有关的向量。我不确定这是否是范围问题... 有谁知道我哪里出错了?

【问题讨论】:

好吧,你做错的一件事是存储一个指针向量。你为什么要这样做,而不是简单地拥有一个项目向量std::vector&lt;Item&gt;?所有这些都增加了额外的复杂性,以及一大堆潜在的问题。 如果可以的话我会,但是分配要求我必须使用对象指针向量 最明显的问题是你没有检查文件是否打开成功。如果文件打开失败,则不会填充矢量,这就是您所看到的。始终检查文件是否打开。 items[i]-&gt;Item::getName() Item:: 是不必要的。 如果可以的话,我会这样做,但是分配要求我必须使用对象指针向量——为什么他们教的与良好的 C++ 实践完全相反?这就像任何以这种方式教授的人都投资于被潜在雇主拒绝的程序员 【参考方案1】:

需要检查的几件事:

    检查文件是否正确打开。使用 is_open() 函数,如 data.is_open();

    不要在向量中使用 Item*,只使用 Item。

    在函数 addItem 中,您将返回一个对象指针,并且从不分配给 main 中的任何指针。无需从该函数返回任何内容。您正在将对象添加到函数本身的向量中。

【讨论】:

以上是关于C++ OOP,输出对象指针向量时的空白控制台,不确定填充向量是不是正确的主要内容,如果未能解决你的问题,请参考以下文章

如何从 C++ 中的“指向对象的指针”向量访问对象

检查指向向量 C++ 中对象的指针

对象指针向量在 C++ 中似乎没有按预期执行

C++,成员函数返回对包含指向 const 对象的指针的向量的 const 引用

在 C++ 中,是不是可以针对这些对象的任何属性轻松地对对象类型指针的向量进行排序?

C++中的指针和向量