-1

編集

ここに私の新しいコードがあります:

class LibItem
{
public:
    //LibItem();
    //LibItem(string setItemTitle, string setItemAuthor, string setItemReleaseDate, string setItemCopyright, string setItemGenre, string setItemStatus)
    //{
    //  Title = setItemTitle;
    //  Author = setItemAuthor;
    //  ReleaseDate = setItemReleaseDate;
    //  Copyright = setItemCopyright;
    //  Genre = setItemGenre;
    //  Status = setItemStatus;
    //}
    //~LibItem(); //DO ******************
    virtual void PrintDetails() = 0;
    void setDetails(string setItemTitle, string setItemAuthor, string setItemReleaseDate, string setItemCopyright, string setItemGenre, string setItemStatus)
    {
        Title = setItemTitle;
        Author = setItemAuthor;
        ReleaseDate = setItemReleaseDate;
        Copyright = setItemCopyright;
        Genre = setItemGenre;
        Status = setItemStatus;
    }
    void setTitle(string TitleName)
    {
        Title = TitleName;
    }
    string getTitle()
    {
        return Title;
    }
    void setReleaseDate(string date)
    {
        ReleaseDate = date;
    }
    string getReleaseDate()
    {
        return ReleaseDate;
    }
    void setAuthor(string AuthorName)
    {
        Author = AuthorName;
    }
    string getAuthor()
    {
        return Author;
    }
    void setCopyright(string CopyrightDetails)
    {
        Copyright = CopyrightDetails;
    }
    string getCopyright()
    {
        return Copyright;
    }
    void setGenre(string GenreDetails)
    {
        Genre = GenreDetails;
    }
    string getGenre()
    {
        return Genre;
    }
    void setStatus(string StatusDetails)
    {
        Status = StatusDetails;
    }
    string getStatus()
    {
        return Status;
    }
private:
    string Title;
    string ReleaseDate;
    string Author;
    string Copyright;
    string Genre;
    string Status;
};

class Book : public LibItem
{
public:
    Book(string setItemTitle, string setItemAuthor, string setItemReleaseDate, string setItemCopyright, string setItemGenre, string setItemStatus, string setItemISBN)
    {
        setDetails(setItemTitle, setItemAuthor, setItemReleaseDate, setItemCopyright, setItemGenre, setItemStatus);
        setISBN(setItemISBN);
    }
    void setISBN(string ISBNDetails)
    {
        ISBN = ISBNDetails;
    }
    string getISBN()
    {
        return ISBN;
    }
    void PrintDetails()
    {
        cout << "Title: " << getTitle() << endl;
        cout << "Author: " << getAuthor() << endl;
        cout << "Release Date: " << getReleaseDate() << endl;
        cout << "Copyrite: " << getCopyright() << endl;
        cout << "Genre: " << getGenre() << endl;
        cout << "Status: " << getStatus() << endl;
        cout << "ISBN: " << getISBN() << endl;
    }

private:
    Book();
    string ISBN;

};

class DVD : public LibItem
{
public:
    DVD(string setItemTitle, string setItemAuthor, string setItemReleaseDate, string setItemCopyright, string setItemGenre, string setItemStatus, int setItemRunningTime, string setItemDirector, string setItemStudio, string setItemProducer)
    {
        setDetails(setItemTitle, setItemAuthor, setItemReleaseDate, setItemCopyright, setItemGenre, setItemStatus);
        setRunningTime(setItemRunningTime);
        setDirector(setItemDirector);
        setStudio(setItemStudio);
        setProducer(setItemProducer);
    }
    void setRunningTime(int RunningTimeDetails)
    {
        RunningTime = RunningTimeDetails;
    }
    int getRunningTime()
    {
        return RunningTime;
    }
    void setDirector(string DirectorDetails)
    {
        Director = DirectorDetails;
    }
    string getDirector()
    {
        return Director;
    }
    void setStudio(string StudioDetails)
    {
        Studio = StudioDetails;
    }
    string getStudio()
    {
        return Studio;
    }
    void setProducer(string ProducerDetails)
    {
        Producer = ProducerDetails;
    }
    string getProducer()
    {
        return Producer;
    }
    void PrintDetails()
    {
        cout << "Title: " << getTitle() << endl;
        cout << "Author: " << getAuthor() << endl;
        cout << "Release Date: " << getReleaseDate() << endl;
        cout << "Copyrite: " << getCopyright() << endl;
        cout << "Genre: " << getGenre() << endl;
        cout << "Status: " << getStatus() << endl;
        cout << "Running Time: " << getRunningTime() << endl;
        cout << "Director: " << getDirector() << endl;
        cout << "Studio: " << getStudio() << endl;
        cout << "Producer: " << getProducer() << endl;
    }

private:
    DVD();
    int RunningTime;
    string Director;
    string Studio;
    string Producer;

};

そして、これは上記のクラスを使用するための私のコードです:

LibItem *test;
test = new DVD("TestDVD","Test Author","01-01-2012","TestCopyright","TestGenre","TestStatus","120","TestDirector","TestStudio","TestProducer");
test->PrintDetails();

このエラーが発生しています:

[BCC32 エラー] 質問 5.cpp(200): E2285 'DVD::DVD(const char *,const char *,const char *,const char *,const char *,const char *,const の一致が見つかりませんでしたchar *,const char *,const char *,const char *)'

このエラーが発生する理由と修正方法についての情報を教えてください。

4

3 に答える 3

0

あなたの最新のエラーは、コンストラクターDVDが6string秒、1秒、intさらに3秒かかるためstringです。

通過中

test = new DVD("TestDVD","Test Author","01-01-2012",
  "TestCopyright","TestGenre","TestStatus","120","TestDirector",
  "TestStudio","TestProducer");

あなたは10string秒を与えています。"120"120は非常に異なるものです。1stringつ目は 120 を示す で、2 つ目はint値が 120 の です。C++ はそれらの間で自動的に変換しません。

代わりにこれを試してください:

test = new DVD("TestDVD","Test Author","01-01-2012",
  "TestCopyright","TestGenre","TestStatus",120,"TestDirector",
  "TestStudio","TestProducer");
于 2012-08-29T09:22:14.763 に答える
0

どうしてこれなの?

クラスのコンストラクターを宣言しましたLibItem()が、定義していません。当然、リンカーはそれを見つけることができず、同じことを訴えます。
それも定義する必要があります。

LibItem()::LibItem()
{
}

デストラクタも同様です。
クラスのコンストラクタまたはデストラクタを明示的に宣言しない場合、コンパイラはそれらの定義を暗黙的に生成しますが、これらを明示的に宣言する場合、それらの定義を提供する責任はあなたにあります。

クラスを2つの別々のファイルに実装する方法を誰かに説明してもらえますか

通常、C++ では、クラス定義はヘッダー ファイル (.h/.hpp) 内に配置され、メンバー関数の定義はソース ファイル (.cpp/.cc) に配置されます。スコープ解決演算子を使用すると、これを行うことができます。

例:

//Myclass.h

class Myclass
{
    public:
       void doSomething();
};

//Myclass.cpp

void Myclass::doSomething()
{

}

また、 Namespacesについて読んでください。シンボル名の衝突を避けるために、カスタム クラスを名前空間に配置することをお勧めします。

于 2012-08-29T04:54:49.507 に答える
0

クラスのすべての関数を宣言および定義しました。一方、宣言しただけで、コンストラクターを定義していません。これは、リンカー エラーが伝えていることです。

コードを .h ファイルと .cpp ファイルに分割することについて質問があったため、リンカ エラーについてはこれ以上詳しく説明しません。代わりに、コードの分離を開始する方法を示します。

まず、宣言のみで .h を作成することをお勧めします。テンプレートとインライン関数を含めることもできます。ただし、これらがどのように機能するかを学ぶまでは、基本に固執しましょう。LibItemクラスの最初のいくつかの関数で説明します。

class LibItem
{
    public:
        LibItem();
        ~LibItem(); //DO ******************
        virtual void PrintDetails() = 0;
        void setDetails(string setItemTitle, string setItemAuthor, string setItemReleaseDate, string setItemCopyright, string setItemGenre, string setItemStatus);
        // The rest of your function declarations here.

    private:  
        string Title;  
        string ReleaseDate;  
        string Author;  
        string Copyright;  
        string Genre;  
        string Status;  
};

クラス宣言には、メンバー関数ごとに 1 行しか含まれていないことに注意してください。これは、関数の名前、戻り値の型、およびパラメーターの型をコンパイラーに伝えるだけです。関数が実際に何をするかはわかりません。これは、次のような関数定義として .cpp ファイルに入ります。

void LibItem::setDetails(string setItemTitle, string setItemAuthor, string setItemReleaseDate, string setItemCopyright, string setItemGenre, string setItemStatus)
{
    Title = setItemTitle;
    Author = setItemAuthor;
    ReleaseDate = setItemReleaseDate;
    Copyright = setItemCopyright;
    Genre = setItemGenre;
    Status = setItemStatus;
}

クラス名と "::" 演算子がメンバー関数名をどのように進めているかに注目してください。これにより、関数がクラスsetDetails()のメンバーであることをコンパイラに伝えます。LibItem

最後に、すべてのコードをコンパイルおよびリンクできる必要があります。正確な詳細は、環境によって異なります。コマンドラインで使用している場合はg++、次のコマンドでコードをコンパイルできます。

g++ main.cpp library.cpp

main.cppその中にwithという名前のファイルmain()があり、OP に投稿したコードが library.cpp という名前のファイルにあると仮定します。

より複雑なプログラムの作成を開始するときは、ソース ファイルの管理に役立つツールを使用する必要があります。makeこれを行うための非常に強力なツールです。多くの C++ IDE が内部で使用しています。IDE について言えば、これらを使用すると、複数のソース ファイルを管理し、それらをコンパイルして単一の実行可能ファイルにリンクするのに役立つ「プロジェクト」を作成できます。

ps補足として、タブではなくスペースを使用してコードをフォーマットする必要があります。後者は、特にこのような Q&A サイトには移植できません。多くの場合、エディターに表示されるものとは異なる書式が作成されます。

于 2012-08-29T05:10:20.913 に答える