-2

エラー C2440: 'return' cannot convert from 'LinkList' to 'Tray *' が発生しているようです。私がやろうとしているのは、2 番目のクラスの出力を顧客クラスの出力に追加することです。したがって、whoIsEating() などのメソッドを呼び出すと、誰が、どこで、何をしたかのリストを簡単に取得できます。「友達」を使うアイデアはありましたが、それについてはよくわかりません。

Customer.h

class Customer
{
private:
    int tableNumber;
    std::string firstName;
    std::string lastName;
    LinkList<Tray> *myTray;
public:
    Customer();
    Customer(std::string sFirstName, std::string sLastName,
        int sTableNumber,
        LinkList<Tray> *myTray = new LinkList<Tray>());
    ~Customer(void);

    int gettableNumber();
    Tray* getTray(void);

顧客.cpp

Tray* Customer::getTray()
{
    return *myTray;
}

ostream& operator << (ostream& output, Customer& customer)
{
    output << customer.getFirstName() << " " << customer.getLastName() << endl
        << customer.gettableNumber() << endl
        << (*customer.getTray()) << endl; //Edit: Fixed this
    return output;

トレイ.cpp

ostream& operator << (ostream& output, Tray& tray)
{
    output << "Drink: " << tray.getdrink() << endl;
    output << "Food: " << tray.getfood() << endl;
    return output;
}

疑わしい出力は次のようになります

名前: ジョン・スミス

テーブル番号: 12

食事の詳細:

お茶を飲む

フード: フィッシュ & チップス

4

2 に答える 2

2

customer.cppファイルには、getTrayがトレイへのポインターを返し、myTrayインスタンス変数を渡します。

Tray* Customer::getTray()
{
    return *myTray;
}

ただし、顧客クラスでは、myTrayをLinkedListとして定義済みです。

class Customer
{
    ...
    LinkList<Tray> *myTray; << here

トレイへのポインタを返す必要があるので、おそらく次のようなことをしたいと思うでしょう。

Tray* Customer::getTray()
{
    return &(myTray->first());
}
于 2012-12-01T21:43:12.843 に答える
0

投稿しました

template<typename T>
class LinkList {
public:
    LinkList();
    ~LinkList();
    void insert(T); //Insert new node in order
    void print(); //Outputs contents
    int getSize();
    void target(T);
    Node<T>* search(T); //Search for value in link list 
                        //and returns pointer to value
    Node<T> *startingPtr;
    Node<T> *endPtr;
private:
    bool isEmpty();
    void insertStart(T); //insert before first node
    void insertEnd(T); //insert after last node
    void insertNext(T);
    void insertBefore(T);
};

template<typename T>
class Node {
    friend class LinkList<T>;
public: 
    T getData();
    Node(T);
    Node* nextPtr;
private:
    T data;
    Node* prevPtr;
};

問題

クラスはLinkedList必要なデータを公開しません。

Tray、別名Tray*:へのポインタを返したい

Tray* Customer::getTray()

...しかし、あなたが持っているオブジェクトはLinkedList<Tray>:へのポインタです。

LinkList<Tray> *myTray; 

このクラスでは、次の例LinkedListにアクセスできます。Node<Tray>*

Node<T> *startingPtr;

...そしてクラスはメソッドを介してオブジェクトへのNodeアクセスを提供します:TraygetData

T getData();

...しかし、残念ながら、が必要であり、そのすべてからTray*を取得するのは簡単ではありませんTray*。(問題は、getDataすぐに消える一時オブジェクトを返すことです。そのため、そのオブジェクトのアドレスを取得してを取得するTray*と、すぐにガベージを指すポインターが得られます。)

解決

回避策の1つは、にアクセスできるをgetTray返すことです。例:Node<Tray>*

Node<Tray>* Customer::getTray()
{
    return myTray->startingPtr;
}

// note that this assumes that the customer has at least one tray in it's list
ostream& operator << (ostream& output, Customer& customer)
{
    output << customer.getFirstName() << " " << customer.getLastName() << endl
        << customer.gettableNumber() << endl
        << customer.getTray()->getData() << endl;
    return output;
}

// note the added 'const', which means tray.getdrink() and tray.getfood()
// will have to be const member methods
ostream& operator << (ostream& output, const Tray& tray) 
{
    output << "Drink: " << tray.getdrink() << endl;
    output << "Food: " << tray.getfood() << endl;
    return output;
}
于 2012-12-02T15:11:28.340 に答える