2014-11-24 86 views
0

我有這樣的代碼:如何使用不同的名稱在for循環中創建多個對象?

// Generate objects from type DepositoFresco or DepositoNormal 

number_depositosf = rand() % (valormaximo - valorminimo + 1) + valorminimo; 

int j; 
for (j = 0; j < number_depositosf; ++j) { 

    type_deposito = 0; 
    id_deposito = "df" + to_string(j); 
    number_paletes = rand() % (valormaximo - valorminimo + 1) + valorminimo; 
    number_produtos = rand() % (valormaximo - valorminimo + 1) + valorminimo; 
    capacity = rand() % (valormaximo - valorminimo + 1) + valorminimo; 
    area = rand() % (valormaximo - valorminimo + 1) + valorminimo; 
    distance = rand() % (valormaximo - valorminimo + 1) + valorminimo; 

    list_depositos.push_back(new DepositoFresco(type_deposito, id_deposito, number_paletes, number_produtos, capacity, area, distance)); 
} 

此代碼的工作,但我想要的是不同的名稱創建對象(在混凝土中,在「id_deposito」變量名)。我tryed做這樣的事情:

number_depositosf = rand() % (valormaximo - valorminimo + 1) + valorminimo; 

int j; 
for (j = 0; j < number_depositosf; ++j) { 

    type_deposito = 0; 
    id_deposito = "df" + to_string(j); 
    number_paletes = rand() % (valormaximo - valorminimo + 1) + valorminimo; 
    number_produtos = rand() % (valormaximo - valorminimo + 1) + valorminimo; 
    capacity = rand() % (valormaximo - valorminimo + 1) + valorminimo; 
    area = rand() % (valormaximo - valorminimo + 1) + valorminimo; 
    distance = rand() % (valormaximo - valorminimo + 1) + valorminimo; 

    DepositoFresco id_deposito = new DepositoFresco(type_deposito, id_deposito, number_paletes, number_produtos, capacity, area, distance) 
    list_depositos.push_back(id_deposito); 
} 

但它不工作。 任何人都知道如何解決它?

+1

什麼類型是list_depositos?你發佈的大部分代碼對於你的要求都是不必要的。 – user1810087 2014-11-24 10:33:37

+0

我不知道你想要做什麼,但有幾個問題:'DepositoFresco id_deposito = new DepositoFresco'你指定一個非指針變量的指針。同樣在第一個片段中,你可以使用'push_back()'指針,在第二個片段中你可以使用非指針。 – 2014-11-24 10:33:58

+0

我想你想要一個std :: map 。所以你可以做'list_depositos [id_deposito] = new DepositoFresco(...);' – LMF 2014-11-24 10:35:22

回答

0

沒有辦法從C++中的字符串創建或修改變量名,但有幾個解決方法。 也許在這種情況下更好地工作的是散列表。散列表是一種在對象之間創建單向關聯的數據結構,因此如果您有對象O1,則可以輕鬆地檢索先前保存的另一個O2。 在這種情況下,您想使用字符串來訪問DepositoFresco對象。

首先你需要包括:

#include <map> 

然後創建您的哈希表如下所示:

std::map<std::string, DepositoFresco*> list_depositos; 

保存到它的讀取,像這樣:

list_depositos[id_deposito] = new DepositoFresco(...); 
list_depositos[id_deposito] 

希望它能幫助! :D

+0

我認爲做#include 是你需要做的。 – 2014-11-24 11:53:57

+0

你說得對。可怕的Ctr + C; Ctr + V技能xD – SlySherZ 2014-11-24 11:56:23

0
#include <random> 
#include <string> 
#include <iostream> 
#include <sstream> 

class Deposito 
{ 
private: 
    int type_deposito; 
public: 
    Deposito(int type_deposito): 
     type_deposito(type_deposito) 
    {} 

    void testFunc() 
    { 
     std::cout << "You called a deposito testFunc with type: " << this->type_deposito << std::endl; 
    } 
}; 

class DepositoFresco : public Deposito 
{ 
private: 
    std::string id_deposito; 
    int number_paletes; 
    int number_produtos; 
    int capacity; 
    int area; 
    int distance; 

public: 
    DepositoFresco(int type_deposito, std::string id_deposito, int number_paletes, int number_produtos, int capacity, int area, int distance): 
     Deposito(type_deposito), 
     id_deposito(id_deposito), 
     number_paletes(number_paletes), 
     number_produtos(number_produtos), 
     capacity(capacity), 
     area(area), 
     distance(distance) 
    {} 

    void testFunc() 
    { 
     std::cout << "You called a depositoFresco testFunc with id: " << this->id_deposito << std::endl; 
    } 

}; 

int main(int argc, char* argv[]) 
{ 
    int valormaximo = 100; 
    int valorminimo = 0; 
    int number_depositosf = rand() % (valormaximo - valorminimo + 1) + valorminimo; 
    std::vector<Deposito*> list_depositos; 
    int j; 
    for (j = 0; j < number_depositosf; ++j) { 

     int type_deposito = 0; 
     std::stringstream ss; 
     ss << j; 
     std::string numStr(ss.str()); 
     std::string id_deposito = "df" + numStr; 
     int number_paletes = rand() % (valormaximo - valorminimo + 1) + valorminimo; 
     int number_produtos = rand() % (valormaximo - valorminimo + 1) + valorminimo; 
     int capacity = rand() % (valormaximo - valorminimo + 1) + valorminimo; 
     int area = rand() % (valormaximo - valorminimo + 1) + valorminimo; 
     int distance = rand() % (valormaximo - valorminimo + 1) + valorminimo; 

     DepositoFresco* deposito = new DepositoFresco(type_deposito, id_deposito, number_paletes, number_produtos, capacity, area, distance); 
     list_depositos.push_back(deposito); 
    } 

    if(list_depositos.size() > 1) 
    { 
     //Retrieve and cast 
     DepositoFresco* retrieved_depositofresco = static_cast<DepositoFresco*>(list_depositos[0]); 
     retrieved_depositofresco->testFunc();//Calls DepositoFresco::testFunc(); 

     //Simple retrieve 
     Deposito* retrieved_deposito = list_depositos[0]; 
     retrieved_deposito->testFunc(); //Calls Deposito::testFunc() 
    } 
} 

這應該編譯和工作。注意:我製作了可能與您不同的Deposito和DepositoFresco課程。我根據我在代碼中看到的內容做出了假設。修改它以滿足您的需求。

這將構建Deposito *的列表(C++向量),就像您向您展示的那樣。注意我給你提取的小例子。我必須static_cast才能調用DepositoFresco函數。如果你不這樣做,你只能訪問Deposito信息。

現在,如果您想根據deposito_id快速訪問這些數據,您將需要一個Hash結構,在這種情況下,您將使用std :: map。有關地圖示例,請參閱SlySherZ。我不會打擾包括代碼。

相關問題