如何使用 setter 作为对象的向量

how to use a setter for vector of an object

提问人:x89 提问时间:5/3/2020 最后编辑:x89 更新时间:5/3/2020 访问量:90

问:

std::vector<Game*> games;

我有以下二传手:

void Instructor::setGames(const std::vector<Game *> &value)
{
    games = value;
}

我试着这样使用它:

 Game g1, g2, g3;
std::vector <Game> gameSet;
    gameSet.push_back(g1);
    gameSet.push_back(g2);
    gameSet.push_back(g3);
    i.setGames(&gameSet);

但是我不断收到此错误:

error: no matching function for call to ‘Instructor::setGames(std::vector<Game>*)’
     i.setGames(&gameSet);

这也行不通。

 i.setGames(gameSet);

我做错了什么?我想在不更改std::vector<Game*> games;

C++ OOP 指针 矢量 std

评论

1赞 PeterT 5/3/2020
std::vector<Game *>并且是两种不同的类型std::vector<Game>*
0赞 x89 5/3/2020
啊,但是当我更改为 时,即使我使用参考@PeterT,我也会在push_back上出现错误std::vector <Game> gameSet;<Game*>
0赞 anastaciu 5/3/2020
问题是什么是,是它还是一个?gamesstd::vector<Game*>std::vector<Game>
0赞 x89 5/3/2020
std::vector<Game*> games;@anastaciu
0赞 pm100 5/3/2020
不要使用原始指针,请使用shared_ptr

答:

0赞 LernerCpp 5/3/2020 #1

i.setGames(&gameSet);

需要指针指向 .这意味着以下函数签名setGamesstd::vector<Game>

void Instructor::setGames(std::vector<Game> *value);

你所拥有的是 const ref to simplestd::vector<Game*>

void Instructor::setGames(const std::vector<Game*> &value);

显然它们是不同的类型,你有错误。


您只需要const std::vector<Game>& value

void Instructor::setGames(const std::vector<Game>& value)
{
    games = value; // also change the type of games  to be std::vector<Game>
}

和主要

  Game g1, g2, g3;
  std::vector <Game> gameSet{ g1, g2, g3};
  i.setGames(gameSet);

评论

0赞 x89 5/3/2020
如果不更改 ''' std::vector<Game*> games;''' ,就没有办法解决这个问题吗?
0赞 LernerCpp 5/3/2020
@FSJ 好的,那么这就是答案。连同 ' i.setGames(gameSet);std::vector<Game*>'。. But you don't need
1赞 anastaciu 5/3/2020 #2

假设您有一个指针向量,即它将接受的对象类型,因此 ,并且必须是指针:Gameg1g2g3

Game *g1, *g2, *g3;
std::vector <Game*> gameSet;

g1 = new Game(); //intialize pointers
g2 = new Game();
g3 = new Game();
//...
i.setGames(gameSet);

现场演示

请注意,现在使用原始指针并不是一个好的做法,最好使用智能指针,看看这一点。

什么是智能指针,何时应该使用智能指针?

评论

0赞 x89 5/3/2020
这给了我一个分段故障核心(转储)
0赞 anastaciu 5/3/2020
@FSJ,我给你做了一个现场演示,把它添加到答案中,希望它有所帮助。