2012-09-02 28 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");