8

私はそのようなクラスを持っています:

class Product
    {
        public :
            virtual double getPrice();
            virtual void setPrice(double price);
    };

class MusicProduct
    {
        protected:

            string author;
            double price;

        public :

            virtual string getAuthor();
            virtual void setAuthor(string author);
            ~MusicProduct();
    };

class CD : public MusicProduct, public Product
    {
        public :

            string getAuthor();
            void setAuthor(string author);
            double getPrice();
            void setPrice(double price);
    };

string CD::getAuthor()
    {
        return MusicProduct::author;
    }

    void CD::setAuthor(string author)
    {
        MusicProduct:author = author;
    }

    void setPrice(double price)
    {
    MusicProduct::price = price;
    }

    double getPrice()
    {
        return MusicProduct::price;
    }

そして、私はそれらのエラーを持っています:

/home/katie/Desktop/Temp/MusicStore.cpp||In member function ‘virtual bool  MusicStore::hasProduct( Product)’:|
/home/katie/Desktop/Temp/MusicStore.cpp|15|warning: no return statement in function returning non-void [-Wreturn-type]|
/home/katie/Desktop/Temp/MusicStore.cpp||In member function ‘virtual  Product  MusicStore::getProduct( Product)’:|
/home/katie/Desktop/Temp/MusicStore.cpp|20|warning: no return statement in function returning non-void [-Wreturn-type]|
/home/katie/Desktop/Temp/MusicStore.cpp||In member function ‘virtual bool  MusicStore::buyProduct( Product)’:|
/home/katie/Desktop/Temp/MusicStore.cpp|25|warning: no return statement in function returning non-void [-Wreturn-type]|
/home/katie/Desktop/Temp/MusicStore.cpp||In member function ‘virtual bool  MusicStore::returnProduct( Product)’:|
/home/katie/Desktop/Temp/MusicStore.cpp|30|warning: no return statement in function returning non-void [-Wreturn-type]|
/home/katie/Desktop/Temp/Store/CD.cpp||In member function ‘virtual void  CD::setAuthor(std::string)’:|
/home/katie/Desktop/Temp/Store/CD.cpp|12|warning: label ‘MusicProduct’ defined but not used [-Wunused-label]|
obj/Debug/Store/CD.o:(.rodata._ZTVN5Music2CDE[vtable for  CD]+0x10)||undefined reference to ` CD::getPrice()'|
obj/Debug/Store/CD.o:(.rodata._ZTVN5Music2CDE[vtable for  CD]+0x14)||undefined reference to ` CD::setPrice(double)'|
obj/Debug/Store/CD.o:(.rodata._ZTVN5Music2CDE[vtable for  CD]+0x20)||undefined reference to `non-virtual thunk to  CD::getPrice()'|
obj/Debug/Store/CD.o:(.rodata._ZTVN5Music2CDE[vtable for  CD]+0x24)||undefined reference to `non-virtual thunk to  CD::setPrice(double)'|
obj/Debug/Store/CD.o:(.rodata._ZTIN5Music2CDE[typeinfo for  CD]+0x10)||undefined reference to `typeinfo for  MusicProduct'|
obj/Debug/Store/CD.o:(.rodata._ZTIN5Music2CDE[typeinfo for  CD]+0x18)||undefined reference to `typeinfo for  Product'|
||=== Build finished: 6 errors, 5 warnings ===|

このコードの何が問題になっていますか?

4

3 に答える 3

15

momogentooによって言及された不足しているCD::修飾子エラーに加えて、これは別の非常に卑劣なエラーです:

void CD::setAuthor(string author)
{
    MusicProduct:author = author; // <-- !!!
}

単一のコロンを使用したため、これは解決演算子としてではなく、ラベル(gotosの場合)として解釈されます。ステートメントが実際に行うことは、同じ文字列オブジェクトに対する自己割り当てです(std :: stringの場合は効果がありません)。

于 2013-02-04T14:43:48.963 に答える
2

最初の問題:

undefined reference to `CD::getPrice()'

その関数の定義にはCD::資格がありません。したがって、代わりに非メンバー関数を宣言および定義します。

double CD::getPrice()
{//    ^^^^ Add this
MusicProduct::price = price;
}

についても同様ですCD::setPrice

2番目の問題:

undefined reference to `typeinfo for  MusicProduct'

おそらく、MusicProductは抽象クラスであると想定されており、その仮想関数の定義を提供したくない場合。その場合、それらをpure virtualと宣言する必要があります:

virtual double getPrice() = 0;
//                        ^^^ Add this

抽象的でない場合は、それらの関数を実装する必要があります。

3 番目の問題:

In member function ‘virtual bool  MusicStore::hasProduct( Product)’:
warning: no return statement in function returning non-void [-Wreturn-type]

おそらく、MusicStore::hasProductブール値を返すはずの関数が呼び出されていますが、そうではありません。

于 2013-02-04T14:52:19.620 に答える
1

void setPrice(2 倍の価格) -> void CD::setPrice(2 倍の価格)

getPrice() も同様

于 2013-02-04T14:33:29.270 に答える