2014-08-27 26 views
0

我正在通過爲樂趣設置的C++問題。我正在創建一個將對象添加到具有隨機特徵的類的循環。其中一個隨機特徵是對象名稱。我有一個程序爲類對象隨機生成名稱,但我無法弄清楚如何將這些名稱分配給類對象。C++命名類具有變量的對象

這裏是我的類,它的構造函數:

#include "stdafx.h" 
#include <iostream> 
#include "windows.h" 
#include <string> 
#include <sstream> 
#include <array> 
#include <time.h> 
#include <conio.h> 

class Bunny 
{ 
public: 
    char fname; 
    int sex, age, color, status; 
    Bunny(int, int, int, int); 
    int s() { return (sex); } 
    int a() { return (age); } 
    int c() { return(color);} 
    int st() { return (status);} 
}; 

Bunny::Bunny(int s, int a, int c, int st) 
{ 
    sex = s; 
    age = a; 
    color = c; 
    status = st; 
} 

這是產生「兔子」的信息循環。

std::string name; 
for (n = 0; n < 1; n++) 
{ 
    int num = std::rand() % 5; 
    int s = std::rand() % 2; 
    std::string f = "Susan"; //this is normally a function which randomly gives names 
    name = f; 
    int a = 0; 
    int c = std::rand() % 5; 
    int st; 
    if (rand() % 50 == 43) st = 1; else st = 0; 
    Bunny name(s, a, c, st); 
} 

,如果它是工作的權利,應該讓一個成員是這樣的:

Bunny Susan(1, 0, 2, 0); 

這不工作,因爲它創建了一個名爲「名」,而不是「蘇珊」一類的對象。我如何通過變量爲類對象分配名稱,而不是在代碼中手動分配名稱。

+2

你不能那樣做。 – abelenky 2014-08-27 22:14:44

+0

C++類不能在運行時修改。 – Barmar 2014-08-27 22:15:08

+2

使用'std :: map'將字符串像「Susan」'寫入數據。 – Barmar 2014-08-27 22:16:06

回答

1

你不能。要做到這一點,正確的方法是存儲在一個map兔子對象,其中姓名是鍵,如:

std::map<std::string, Bunny> bunnies; 
std::string name; 
for (n = 0; n < 1; n++) { 
    ... 
    // Assign a name to "name" 
    ... 
    bunnies[name] = Bunny(s, a, c, st); 
} 

bunnies["Susan"]然後將包含名爲「蘇珊」相關的Bunny

+1

你的意思是'兔子[「蘇珊」]' – Barmar 2014-08-27 22:18:57

+0

@Barmar:正確;固定。 – jwodder 2014-08-27 22:22:12

+1

我將如何訪問新對象的類函數?從我的例子訪問函數a()id使用'Susan.a()'。它會是「兔子」(「蘇珊」)。a()'? – jeffpkamp 2014-08-27 22:30:41

-1

如果我正確理解你,你想創建變量而不是變量的內容。 這是不可能的,編譯器會生成一個符號,最終引用一個變量(人類可讀名稱)的內存地址。 在運行時,這些人類可讀符號已失去其用途。無論如何,你爲什麼要動態變量名?

+0

我正在生成隨機類對象,最多爲1000個,並且輸入1000個類對象名稱似乎很乏味,所以我正在使用循環生成它們。 – jeffpkamp 2014-08-27 22:27:41

0

首先,你混合使用術語「成員」。一個類的'成員'是類中定義的方法和變量,在你的情況下,變量是'fname','sex','age','color','status'和方法s() ,a(),c()和st()。當你打電話給'Bunny name(s,a,c,st)'時創建的';'不是'成員',它是該班級的「實例」。

其次,沒有辦法做你想做的事情。變量名只存在於程序員,並且在運行時沒有意義(除非您正在調試)。變量名必須能夠在編譯時確定,而您的隨機化嘗試發生在運行時。

當你創建一個'std :: string name'並且以後創建一個'Bunny name(...)'時,你將創建兩個不同的名字爲'name'的變量,事實上它已經在使用你重用它對你的新對象的構造函數沒有任何影響。如果有的話,你的編譯器應該向你抱怨你正在重用一個現有的變量名,儘管新的變量名被限制在循環的範圍之內。

然而,真正的問題是,爲什麼你想/需要這樣做呢?如果你的變量名是隨機的,那麼你將如何在程序的其他地方引用這些變量?如果這樣做的原因是需要創建多個類實例而不知道它們的標識符或事先需要的總數,那麼我建議看看std :: vector

+0

該變量只是將名稱從生成器移動到對象的一種方法。生成「名稱」列表,以便我可以稍後調用這些值。如果您將jwodder包含在下面的例子中,您的答案會更有幫助。 – jeffpkamp 2014-08-27 23:39:27

+0

我曾經想過回去並在第一次發佈回覆後添加一個示例,但jwodder的差不多是我將要使用的示例,它使用字符串值映射到類實例的標識符 – rdowell 2014-08-28 19:01:04