c++中vector封装的push_back函数调用还是报错

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c++中vector封装的push_back函数调用还是报错相关的知识,希望对你有一定的参考价值。

部分代码如下:
string temp,t[8];
int y;
ifstream fp("TestData.txt");
if(fp)

getline(fp,temp);
while(fp)

getline(fp,temp); //利用getline函数按行读取文件,数据存入temp中
ReadToClass (temp,t[0],t[1],t[2],t[3],t[4],t[5],t[6],t[7]); //把temp按要求分割成子块
y=Differ (t[1]);
if(y==0) //以下是根据数据中的二级分类进行条件选择,将数据读入到对应的类数组中

cp.ReadFromTemp (temp);
computer.push_back (cp); //报错:error C2558: class“Computer”: 没有可用的复制构造函数或复制构造 函数声明为“explicit” ( 而实际上我编写了复制构造函数)
continue;

仔细检查一下,应该是没有定义复制构造函数或是定义错了,要不就把Computer类的声明和实现贴出来。 参考技术A cp有构造函数吗?追问

有的。
关键是这个cp在cp.ReadFromTemp (temp);步骤中就已经赋值了,可是就是不能通过computer.push_back (cp);加入到computer中去,VS2012总是报错。说没有赋值构造函数的话,明明是我已经定义好了的

追答

cp是个类吧,在vector中保存cp的指针试试。

追问

cp确实是个类;
但是,
如何在vector中保存cp指针?

追答

用new在堆上构造cp,就可以在vector中保持cp的指针啊。
比如Test *cp = new Test();
Vector testvec;
testvec->push_bak(cp);

本回答被提问者采纳

想简化我的 std::vector push_back 使用

【中文标题】想简化我的 std::vector push_back 使用【英文标题】:Want to simplify my std::vector push_back usage 【发布时间】:2019-08-15 11:51:48 【问题描述】:

我开始在 c++ 中使用 std::vector 并且想知道是否有更好的方法来编写我的代码。

我尝试直接使用 push_back(本问题末尾的示例),但看起来我无法在 push_back 函数中使用类函数。

这是我要优化的主要部分:

ShopTower st_temp;
    vector<ShopTower> shopTower;
    st_temp.set("Bow Tower", "images/tower/bowtowerBuy.png", 30, 30, 1);
    shopTower.push_back(st_temp);
    st_temp.set("Cannon Tower", "images/tower/cannontowerBuy.png", 30, 30, 2);
    shopTower.push_back(st_temp);
    ...

和我的设置函数:

void set(string aName, string aAdr, int aH, int aW, int aNr)
            name = aName;
            adr = aAdr;
            size.set(aH,aW);
            setAtBottom(20+((aNr-1)*(aW+20)), 20);
        

为了说明清楚,size.set 是一个简单的 height=ah width=aw 函数,setAtBottom 基本相同,只是设置了从左下角开始计数的位置。

如果可能的话,我想删除 st_temp 变量并将我的代码重写为这样的:

    shopTower.push_back(set("Bow Tower", "images/tower/bowtowerBuy.png", 30, 30, 1));

【问题讨论】:

为了清楚起见,您应该添加 minimal reproducible example 并解释“似乎不起作用”的含义 如果您修改 ShopTower 的构造函数以获取您需要的所有参数。你可以做 shopTower.push_back(ShopTower("Bow Tower", "images/tower/bowtowerBuy.png", 30, 30, 1)); @rafaelgonzalez 请使用答案部分的答案。评论无法投票,您的解决方案相当不受欢迎,OP 要求优化,您建议他们创建一个不必要的实例并复制它,这远非最佳 @foreknownas_463035818 我希望我的编辑版本是规则确认 - 我实际上认为我的代码示例是最小的可重现示例,如果需要我会添加课程,但我认为因为它应该是最小的我的设置函数解释我上课的内容。我还需要发布我的班级父母,因为 shoptower : myobject 包含类 size(w,h) 和 pos(x,y)。如果它仍然不符合我将尝试再次编辑我的帖子。 您的示例仍然无法重现,因为您可以复制并编译它,但至少现在您清楚了“不工作”的含义,并且该示例足以说明原因。 【参考方案1】:

听起来你想要emplace_back。如果您还没有,则需要有一个构造函数 ShopTower::ShopTower(string aName, string aAdr, int aH, int aW, int aNr)

shopTower.emplace_back("Bow Tower", "images/tower/bowtowerBuy.png", 30, 30, 1);
shopTower.emplace_back("Cannon Tower", "images/tower/cannontowerBuy.png", 30, 30, 2);

【讨论】:

谢谢 - 这是完美的!【参考方案2】:

直接的方法是在ShopTower 类上创建一个构造函数,然后在push_backemplace_back - 正如已在接受的答案answer 中指出的那样。

如果出于某种原因无法选择(即,您不能或不会添加合适的构造函数) - 那么您可以创建一个工厂函数创建对象

ShopTower createShopTower(string aName, string aAdr, int aH, int aW, int aNr);

并使用任一:

shopTower.push_back(createShopTower("Bow Tower", "images/tower/bowtowerBuy.png", 30, 30, 1));

或使用std::move 以避免多余的副本:

shopTower.emplace_back(std::move(createShopTower("Bow Tower", "images/tower/bowtowerBuy.png", 30, 30, 1)));

【讨论】:

【参考方案3】:

如果您从 set() 函数返回(引用)您的对象,您的尝试将起作用:

ShopTower& set(/* args */) 
    /* do the setting */
    return *this;

但是在这里重用单个对象确实没有¹好处,所以每次只需 emplace_back() 一个新对象。


¹除非 ShopTower 的某些内容您没有与我们共享并且需要在所有内容中通用(问题是缺乏良好的 MCVE)。

【讨论】:

以上是关于c++中vector封装的push_back函数调用还是报错的主要内容,如果未能解决你的问题,请参考以下文章

c++ 二维容器vector 如何push_back!!?

C++ vector容器中用erase函数和迭代器删除重复元素问题分析

.push_back 如何在 C++ 中工作?

为啥不能在 2D 向量中 push_back? C++

c++中的vector是指针吗?

想简化我的 std::vector push_back 使用