[英]Filing a vector outside of a function in a class
這里有一個相當簡單的問題,在類.cpp文件中填充函數外部的向量是什么? 目前我正在嘗試以下不起作用:
std::vector<Player> midfielder(8);
midfielder.at(0) = Midfielder("Default ",0,"Midfielder");
midfielder.at(1) = Midfielder("David Armitage ",1,"Midfielder");
midfielder.at(2) = Midfielder("Tom Rockliff ",2,"Midfielder");
midfielder.at(3) = Midfielder("Gary Ablett ",3,"Midfielder");
midfielder.at(4) = Midfielder("Dyson Heppel ",4,"Midfielder");
midfielder.at(5) = Midfielder("Scott Pendlebury",5,"Midfielder");
midfielder.at(6) = Midfielder("Michael Barlow ",6,"Midfielder");
midfielder.at(7) = Midfielder("Jack Steven ",7,"Midfielder");
為了提供上下文,'Midfielder'是一個繼承自'Player'類的類。
TeamManagment.h
#ifndef TEAMMANAGEMENT_H
#define TEAMMANAGEMENT_H
#include <vector>
#include "Player.h"
#include "Midfielder.h"
#include <string>
class TeamManagement
{
public:
TeamManagement();
void Display_Players();
};
#endif // TEAMMANAGEMENT_H
TeamManagement.cpp
#include <iostream>
#include <string>
#include <vector>
#include "Player.h"
#include "Midfielder.h"
#include "TeamManagement.h"
using namespace std;
TeamManagement::TeamManagement()
{
}
std::vector<Player> midfielder(8);
//errors start occurring on line below: 'midfielder' does not name a type
midfielder.at(0) = Midfielder("Default ",0,"Midfielder");
midfielder.at(1) = Midfielder("David Armitage ",1,"Midfielder");
midfielder.at(2) = Midfielder("Tom Rockliff ",2,"Midfielder");
midfielder.at(3) = Midfielder("Gary Ablett ",3,"Midfielder");
midfielder.at(4) = Midfielder("Dyson Heppel ",4,"Midfielder");
midfielder.at(5) = Midfielder("Scott Pendlebury",5,"Midfielder");
midfielder.at(6) = Midfielder("Michael Barlow ",6,"Midfielder");
midfielder.at(7) = Midfielder("Jack Steven ",7,"Midfielder");
//errors stop occurring here
void TeamManagement::Display_Players(){
cout<<"Position Name ID"<<endl;
for (int i=1;i<8;i++)
{
cout<<midfielder[i].Player_Details()<<" "<<midfielder[i].Get_player_id()<<endl;
}
}
第一個問題是你不能在函數之外執行賦值。 您必須使用構造或初始化。
使用C ++ 98,您無法在函數外部填充/初始化向量。
使用C ++ 11/14,您可以使用初始化程序語法填充一個:
#include <iostream>
#include <vector>
struct Thing {
int m_i, m_j;
Thing(int i, int j) : m_i(i), m_j(j) {}
};
std::vector<Thing> things {
{ 1, 2 }, { 2, 3 }
};
int main() {
std::cout << "things[0].m_j = " << things[0].m_j << '\n';
}
但是std :: vector不會讓你試圖把“中場”變成玩家的矢量。 讓我們使用SSCCE來重建你正在做的傷害:
#include <iostream>
struct Base {
int i;
};
struct Derived : public Base {
int j;
};
int main() {
std::cout << "Base size = " << sizeof(Base) << '\n';
std::cout << "Derived size = " << sizeof(Derived) << '\n';
}
這告訴我們Base和Derived有不同的大小。 但是你試圖將這兩個對象放在同一個容器中,因為它們是相關的。 圓釘和方釘相關......它們不適合同一個孔,這就是我們現在遇到的問題。
向量根據您提供的類型在內存中為元素創建空間,然后它要求您准確傳遞它以使用該類型填充這些空間,或者將類型轉換為存儲類型的轉換機制。
如果你想擁有一個不同類型的容器,你需要使用指針,但是你會遇到問題,你得到的將是一個指向基類型的指針,你需要自己提供用一種方法來區分不同的球員類型。
有關C ++ 98方法,請參閱將派生類對象存儲在基類變量中。 在現代C ++(11和14)中,您應該使用智能指針,例如
std::vector<std::unique_ptr<Base>>
std::vector<std::shared_ptr<Base>>
據推測,默認構建一名Midfielder
沒有多大意義,所以你可以reserve
記憶,然后將emplace_back
到vector
。
std::vector<Player> midfielder {};
midfielder.reserve(8);
midfielder.emplace_back("Default ",0,"Midfielder");
midfielder.emplace_back("David Armitage ",1,"Midfielder");
midfielder.emplace_back("Tom Rockliff ",2,"Midfielder");
midfielder.emplace_back("Gary Ablett ",3,"Midfielder");
midfielder.emplace_back("Dyson Heppel ",4,"Midfielder");
midfielder.emplace_back("Scott Pendlebury",5,"Midfielder");
midfielder.emplace_back("Michael Barlow ",6,"Midfielder");
midfielder.emplace_back("Jack Steven ",7,"Midfielder");
midfielder.at(0) = Midfielder("Default ",0,"Midfielder");
是一份聲明。 您已經在(全局)命名空間范圍內放置了這些和類似的語句。 那是你的錯。 只有聲明可能在命名空間范圍內。 您必須將語句放在函數中。
錯誤消息源於以下事實:不以關鍵字開頭的聲明以類型名稱開頭。 由於midfielder
不是關鍵字,編譯器希望它是一個類型名稱,但它不是一個,所以你得到錯誤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.