2013-12-09 70 views
0

我想在運行時創建對象。我有一個未指定數量的對象來創建,我完全失去了。我被告知要使用指針來做這件事,但我不確定哪怕要使用指針。在C++運行時動態創建類對象

這是我的代碼。

#include <iostream> 
#include <string> 
using namespace std; 

class Consumer 
{ 
public: 
    int idNum; 
    string info; 
    int maxHours; 
    Consumer(int, string, int); 
    void display(); 
    void newCons(); 
}; 

Consumer::Consumer() 
{ 
    idNum = id; 
    info = in ; 
    maxHours = hrs; 
} 

void Consumer::newCons() 
{ 
    int idn; 
    string npa; 
    int mhrs; 
    cout << "Please input the consumer's ID number." << endl; 
    cin >> idn; 
    cout << "Please input the consumer's full name, phone number, and address." << endl; 
    cout << "Do not press enter until you have entered all three." << endl; 
    cin >> npa; 
    cout << "Please input the max number of hours the consumer spends purchasing products each week." << endl; 
    cin >> mhrs; 

    Consumer anotherCons(idn, npa, mhrs); 

    return; 
} 

void Consumer::display() 
{ 
    return; 
} 

int main() 
{ 
    int i, howMany; 
    Consumer* anotherCons; 
    anotherCons = new Consumer(); 

    anotherCons->newCons(); 

    return 0; 
} 
+0

提示:您構建的簽名不匹配 – yuan

+0

謝謝,這所有的周圍打的,還沒有清理的測試部分了。 – jwhite

+1

這是你的真實密碼嗎?它不應該編譯.. – 0x499602D2

回答

0

使用std::vector:(#include <vector>

vector<Consumer> list; 
for(int i = 0; i < num_you_want_to_create; ++i){ 
    Consumer c; //declare an object of type consumer, if it doesn't work, try: 
    //Consumer c(1, "test", 1); 
    list.push_back(c); //creates a new consumer 
} 
+0

(64):error C2512:'Consumer':沒有合適的默認構造函數available – jwhite

+0

是的,因爲你定義了一個默認的構造函數,但沒有在你的類中聲明它 – yizzlez

+0

是不是構造函數Consumer?我將其更改爲: – jwhite

0
anotherCons = new Consumer(); 
//   ^^^^^^^^^^^^^^ 

這裏你打電話你Customer類的默認構造函數。你已經爲你的類定義了一個類,但它沒有被前向聲明(在類體中原型化)。你有一個構造函數定義爲:

Customer(int, string, int); 

但這是一個完全不同的構造函數。你需要有一個默認的構造函數的原型,以及一個專門的構造函數:

Customer(); 
Customer(int, string, int); 

而且,在你的newCons方法,您可撥打以上parameratized構造。這會再次導致錯誤,因爲您沒有在您給我們的代碼中的任何地方定義構造函數。構造函數應該被定義是這樣的:

Customer::Customer(int id, string in, int hrs) 
    : idNum(id), info(in), maxHours(hrs) 
{ } 

這裏我們使用成員初始化列表。你也可以在默認構造函數中使用它。


@awesomeyi說什麼是正確的,你可以使用一個std::vector在運行時動態添加對象。這比手動分配內存的分配要好,因爲它是由矢量的構造函數/析構函數手動完成的。

而且,我覺得你的newCons功能應改爲:

static Consumer newCons(); 

我加static Consumer的返回類型和擺脫void。我爲什麼要這樣做?那麼,我將返回Consumer,因爲它符合函數的語義 - 您要創建一個新的Consumer對象,但是在創建它時如何處理它?那麼,你必須將對象返回給調用者,以便他們可以使用它,所以我決定最好返回一個新對象。在最後一行,你會做:

Consumer anotherCons(idn, npa, mhrs); 
return anotherCons; 

return Consumer(idn, npa, mhrs); 

這是偉大至今。這裏是什麼main身體的樣子:

int main() 
{ 
    std::vector<Consumer> v; 
    v.push_back(Consumer()); 

    v.at(0) = Consumer::newCons(); 
} 

這只是main一個例子。你的真實代碼可以是任何東西。

就個人而言,我認爲最好爲Consumer對象定義一個提取器,因爲它符合標準IOStreams庫的感覺。例如:

std::istream& operator>>(std::istream& is, Consumer& c) 
{ 
    c = Consumer::newCons(is); 
    return is; 
} 

,這也有必要採取Consumer::newCons參數:

static Consumer newCons(std::istream& is) 

和到位的cin使用is

現在:

int main() 
{ 
    std::vector<Consumer> v; 

    Consumer c; 
    std::cin >> c; 

    v.push_back(c); 
}