1

C++で宿題のプログラムを書いています。初期化されたコンストラクターから別のコンストラクターに値を渡す際に少し問題があり、次のように表示されます。

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

私は OOP に少し慣れておらず、C++ は初めてです。

さらにコードを含める必要がある場合は投稿してください。変換を行うことができないメイン クラスとクラスのコードを添付します。プログラムはほとんど完成していません。

メイン.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;
};
4

3 に答える 3

7

Book コンストラクターは渡された値ではなくポインターを想定しているため、Author ポインターと Publisher ポインターを逆参照しないでください。

ただし、これらすべてのポインターを処理する場合、多くのメモリ管理の問題が発生する可能性があります。プログラムが終了するとすべてのメモリが解放されるため、これは小さなプログラムでは問題ありませんが、メモリを正しく管理する習慣を身につけることが重要です。値渡しを避けたい場合は、C++ の参照について読む必要があります。

于 2012-09-02T18:22:52.177 に答える
2

Book のコンストラクターはポインターを必要としますが、逆参照された値を指定します。

                                   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
于 2012-09-02T18:23:44.370 に答える
2

値を設定するだけの場合は、おそらく const 参照としてパラメーターを受け取る必要があります。

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

次に、通常の方法でそれらを渡します。

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

または、そのメソッド内で作成者オブジェクトのみを使用している場合は、実際に使用する必要はなくnew、スタックに置くことができます。これにより、プログラムでの潜在的なメモリ リークが回避されます。

Author author("John", "Doe");
于 2012-09-02T18:23:54.133 に答える