2015-02-17 3 views
-1

У меня есть класс с именем Package, который содержит объекты класса Address как частные члены данных. Есть другие классы, но я не показывал их, поскольку они не нужны. Мне предоставили адрес.h и файлы cpp, и я не могу их изменить.Нужна помощь при использовании композиции в классе

Проблема возникает в файле пакета Package.cpp (строка 5), где мне нужно инициализировать объекты Address, потому что я использую композицию, но я не знаю, как это сделать. Я знаю, что мне нужно явно вызвать перегруженный конструктор класса адресов, но я не знаю, как это сделать. Когда я ставлю :Address после конструктора пакета, я сразу же получаю сообщение об ошибке: Address не является нестатистическим элементом данных или базовым классом класса Package.

Address.h

#ifndef ADDRESS_H 
#define ADDRESS_H 

#include <string> 

class Address 
{ 
public: 
    // constructor initializes data members 
    Address(const std::string &, const std::string &, const std::string &, const std::string &, int); 
    virtual ~Address() { } // virtual destructor 

    void setName(const std::string &);  // set name 
    std::string getName() const;    // return name 
    void setAddress(const std::string &); // set street address 
    std::string getAddress() const;   // return street address 
    void setCity(const std::string &);  // set city 
    std::string getCity() const;    // return city 
    void setState(const std::string &); // set state 
    std::string getState() const;   // return state 
    void setZIP(int);      // set sZIP code 
    int getZIP() const;      // return ZIP code 
    void print() const;      //print the data members 

private: 
    // data members to store sender and recipient's address information 
    std::string name; 
    std::string streetAddress; 
    std::string city; 
    std::string state; 
    int ZIP; 
}; 

#endif 

Asssign3.cpp

// Assign3.cpp 
// Processing Packages polymorphically. 
#include <iostream> 
#include <iomanip> 
#include <vector> 
#include "Package.h"   // Package class definition 
#include "TwoDayPackage.h" // TwoDayPackage class definition 
#include "OvernightPackage.h" // OvernightPackage class definition 
#include "Address.h"   // Address class definition 
using namespace std; 

int main() 
{ 
    // create vector packages 
    vector < Package * > packages(3); 

    //create to and from address for the three objects 
    Address add1To("Lou Brown", "1 Main St", "Boston", "MA", 11111); 
    Address add1From("Mary Smith", "7 Elm St", "New York", "NY", 22222); 

    Address add2To("Lisa Klein", "5 Broadway Rd", "Indianapolis", "IN", 33333); 
    Address add2From("Bob George", "21 Pine Rd", "Miami", "FL", 44444); 

    Address add3to("Ed Lewis", "2 Oak St", "Boston", "MA", 55555); 
    Address add3From("Don Kelly", "9 Main St", "Denver", "CO", 66666); 

    // initialize vector with Packages 
    packages[ 0 ] = new Package(add1To, add1From, 8.5, .5); 
    packages[ 1 ] = new TwoDayPackage(add2To , add2From, 10.5, .65, 2.0); 
    packages[ 2 ] = new OvernightPackage(add3to , add3From, 12.25, .7, .25); 

    cout << fixed << setprecision(2); 
    // print each package's information and cost 
    for (size_t i = 0; i < packages.size(); i++) 
    { 
     cout << "PACKAGE " << i + 1 << "\n"; 
     packages[i]->print();   

     double cost = packages[ i ]->calculateCost(); 
     cout << "\nShipping Cost: $" << cost << "\n\n"; 
    } 
} 

Package.cpp ОШИБКА ЗДЕСЬ

#include "Package.h" 
#include "Address.h" 

Package::Package(Address gets, Address sends, double weight, double costPerOunce) 
{ // error no default constructor for class "Address" 
    double weight = weight; 
    double costPerOunce = costPerOunce; 
} 

double Package::getWeight()const 
{ 
    return weight; 
} 

Package.h

#ifndef PACKAGE_H 
#define PACKAGE_H 
#include "Address.h" 

class Package 
{ 
public: 
    Package(Address recipient, Address sender, double weight, double costPerOunce); 
    virtual ~Package(); 

    double getWeight()const; 
    virtual void print() const; 
    double calculateCost()const; 

private: 
    Address recipient; 
    Address sender; 
    double weight; 
    double costPerOunce; 
}; 
#endif 
+2

Отправьте свой код напрямую, а не ссылку. –

+0

[Как задать хороший вопрос?] (Http://stackoverflow.com/help/how-to-ask) –

ответ

0

У вас есть два Address членов и как сказано об ошибках, которые класс не имеет конструктора по умолчанию. Поэтому вам необходимо инициализировать своих 2 Address членов класса.

Package::Package(Address gets, Address sends, double weight, double costPerOunce) : 
    recipient(gets), 
    sender(sends), 
    weight(weight), 
    costPerOunce(costPerOunce) 
{ 
    // I'm guessing you want to set your class members instead of these local variables...  
    //double weight = weight; 
    //double costPerOunce = costPerOunce; 
} 

Unrelated, но вы, вероятно, хотите использовать const Address& как тип для ваших параметров конструкции.

Часть : называется iniatializer list.

+0

спасибо большое, что я понимаю сейчас! – Christian

Смежные вопросы