2012-09-02 58 views
1

我正在編寫一個用C++編寫家庭作業的程序。我有一個問題位從一個構造函數初始化值傳遞到另一個和它說:如何正確地將變量傳入和傳出非默認構造函數?

error C2664: 'Book::Book(std::string,Author *,Publisher *,double)' : cannot convert parameter 2 from 'Author' to 'Author *' 

我有點在OOP生鏽和新的C++。

請張貼如果我應該包含更多的代碼我會附上從我不能做轉換的主類和類的代碼。該方案還沒有完成。

Main.cpp的

#include <iostream> 
using namespace std; 

#include "Book.h" 

void main() 
{ 
    cout << "Book 1" << endl; 

    Author *pAuthor = new Author("John", "Doe"); 
    Publisher *pPublisher = new Publisher("Wrox", "10475 Crosspoint Blvd.", "Indianapolis"); 
    Book *book = new Book("Memory Management", *pAuthor, *pPublisher, 49.99); 

    cout << "Book 2" << endl; 
    int i; 
    cin >> i; 
}; 
+1

一幾點:你根本不應該使用'new',並且因爲這個簡單的程序,你已經有了內存泄漏。取一個臨時地址是非法的&(ostringstream()<< number)'並且不應該編譯。另外,'string(title)'是多餘的,它可以只是'title'。另外'void main'是非法的,它應該是'int main',你不必從它返回任何東西,它會自動返回'0'(儘管_no其他函數將會這樣做,main是一個特例)。 –

回答

7

你不應該取消引用的作者和出版商的指針,因爲書構造函數需要指針,而不是通過值英寸

然而,所有這些指針打交道時,你可能會遇到很多內存管理問題。這對於一個小程序是可以的,因爲一旦程序退出後所有的內存都會被釋放,但是養成正確管理內存的習慣非常重要。如果你想避免按值傳遞,也許你應該閱讀關於C++中的引用。

+2

Oww你快+1 –

2

書的構造函數需要指針,但是你給它提供了取消引用的值。

        wants pointer  wants pointer 
            ^    ^          
            |     | 
            |     | 
Book::Book(string title, Author *pAuthor, Publisher *pPublisher, double price) 
{ 
    title = title; 
    price = price; 
} 

但在main(),

Book *book = new Book("Memory Management", *pAuthor, *pPublisher, 49.99); 
              |   | 
              |   | 
              \/   \/ 
             Dereferenced, so its a value copied 
2

如果你只是設置你可能應該接收參數爲const引用值:

Author::Author(const string& first, const string& last) 
{ 
    firstName = first; 
    lastName = last; 
} 

然後,只需把它們放入正常方法:

Author *pAuthor = new Author("John", "Doe"); 

或者,如果你只使用該方法中author對象,你並不真的需要使用new你可以把它在棧中,這將避免潛在的內存泄漏在你的程序:

Author author("John", "Doe");