簡體   English   中英

在類中的函數之外歸檔向量

[英]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_backvector

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM