указатели — вопросы C ++ по наследованию, конфиденциальности и объектам в отгрузочной программе с несколькими классами и заголовками

Моя программа должна печатать адреса «до» и «от», полученные из метода EndPoint toString, но я не могу понять, как это реализовать. Вот мой код Как получить метод toString в конструкторе Package :: Package для печати содержимого метода toString в EndPoint?

// ShippingProgram.cpp :
//

#include "stdafx.h"#include <iomanip>
#include <stdexcept>
#include <sstream>
#include <iostream>
#include "Package.h" // Package class definition
using namespace std;

// constructor

EndPoint::EndPoint(const string& nameInfo, const string& addressInfo, const string& cityInfo, const string& stateInfo, int zipInfo) {
name = nameInfo;
address = addressInfo;
city = cityInfo;
state = stateInfo;
zip = zipInfo;
}string EndPoint::toString() const {
ostringstream output;
output << fixed << setprecision(2); // two digits of precision
output << name << "\n" << address << "\n" <<
city << ", " << state << " " << zip;
return output.str();
}Package::Package(EndPoint senderInfo, EndPoint receiverInfo, double weightInfo, double costPerOzInfo) {

weight = weightInfo; // should validate
costPerOz = costPerOzInfo;
}void Package::calculateCost(double)
{
}

double Package::calculateCost() const {
return weight * costPerOz;
}string Package::toString() const {
ostringstream output;
output << fixed << setprecision(2); // two digits of precision
output << "\nFrom:\n" << senderInfo.toString() << "\n\nTo:\n" <<    receiver <<
"\n\nWeight: " << weight << endl <<
"\nShipping cost:\n" << calculateCost();
return output.str();
}

Основной метод:

#include <iostream>
#include <iomanip>
#include "stdafx.h"//#include "TwoDayPackage.h"//#include "OvernightPackage.h"#include "Package.h"using namespace std;

int main()
{
// Three address records.

EndPoint homer{ "Homer Simpson", "742 Evergreen Terrace", "Springfield",
"FL", 32401 };

EndPoint donald{ "Donald Duck", "1313 Webfoot Walk", "Duckburg",
"CA", 95501};

EndPoint kermit{ "Kermit Frog", "On the Swamp", "Leland", "MS", 38756 };

// This calls the base class constructor (regular fee).

Package regular{ homer, donald, 25.0, 0.20 };

// Defines output precision for floating point numbers (iomanip).

//  cout << fixed << setprecision(2);

// Prints package parameters.

cout << "Regular package processed." << endl;
cout << regular.toString();
cout << "Shipping Cost: $" << regular.calculateCost() << endl << endl;
cout << homer.toString();
// First derived class (two-day fee added).

/* TwoDayPackage twoday{ donald, kermit, 17.5, 0.20, 2.0 };

cout << "Two-day package processed." << endl;
cout << twoday.toString();
cout << "Shipping Cost: $" << twoday.calculateCost() << endl << endl;

// Second derived class (overnight fee added).

OvernightPackage overnight{ kermit, homer, 14.2, 0.20, 0.50 };

cout << "Overnight package processed." << endl;
cout << overnight.toString();
cout << "Shipping Cost: $" << overnight.calculateCost() << endl << endl;
*/
}

Этот проект требует, чтобы я создал программу доставки с наследованием. Он должен включать класс «EndPoint», который является закрытым и содержит информацию об отправителе и получателе, и класс «Package», который компилирует все и помещает его в строку.

Мои ошибки связаны с тем, как в моем мире мой конструктор пакетов может содержать информацию из моего класса EndPoint. Поскольку основной метод отформатирован так, что класс Package должен быть (EndPoint, EndPoint, Weight, Cost), но он не компилируется таким образом. Наверное, я просто не понимаю, как отправить информацию EndPoint объектам Package.

Вот мои ошибки:

  1. Нет экземпляра конструктора "Package::Package" matches the argument list argument types are: (EndPoint, EndPoint, double, double)
  2. Error C2440 'initializing': cannot convert from 'initializer list' to 'Package'
  3. Error C3861 'setprecision': identifier not found

Package.h

#pragma once
#ifndef PACKAGE_H
#define PACKAGE_H
#include <string>
#include <iostream>
using namespace std;

class EndPoint {
public:
EndPoint(const std::string&, const std::string&, const std::string&, const std::string&, int = 0.0);

void setName(const std::string&);
std::string getName() const;

void setAddress(const std::string&);
std::string getAddresss() const;

void setCity(const std::string&);
std::string getCity() const;

void setState(const std::string&);
std::string getState() const;

void setZip(int);
int getZip() const;

string toString() const;
protected:
std::string name;
std::string address;
std::string city;
std::string state;

int zip;
};
class Package {
public:
string toString() const;
Package(const std::string&, const std::string&, double = 0.0, double = 0.0);

void setSender(const std::string&);
std::string getSender() const;

void setReceiver(const std::string&);
std::string getReceiver() const;

void setWeight(double);
double getWeight() const;

void setCostPerOz(double);
double getCostPerOz() const;

void calculateCost(double);
double calculateCost() const;

double calculateCost(double weight, double costPerOz)
{
double shipping;
shipping = weight * costPerOz;

cout << "The Base Cost = " << shipping << endl << endl;
return shipping;
}protected:
std::string sender;
std::string receiver;
double weight; // gross weekly sales
double costPerOz; // commission percentage
};

#endif

Package.cpp

#include "stdafx.h"#include <iomanip>
#include <stdexcept>
#include <sstream>
#include "Package.h" // Package class definition
using namespace std;

// constructor

EndPoint::EndPoint(const string& nameInfo, const string& addressInfo, const string& cityInfo, const string& stateInfo, int zipInfo) {
name = nameInfo;
address = addressInfo;
city = cityInfo;
state = stateInfo;
zip = zipInfo;
}

void EndPoint::setName(const string& nameInfo) {
name = nameInfo;
}

string EndPoint::getName() const { return name; }

void EndPoint::setAddress(const string& addressInfo) {
address = addressInfo;
}

string EndPoint::getAddresss() const { return address; }

void EndPoint::setCity(const string& cityInfo) {
city = cityInfo;
}

string EndPoint::getCity() const { return city; }

void EndPoint::setState(const string& stateInfo) {
state = stateInfo;
}

string EndPoint::getState() const { return state; }

void EndPoint::setZip(int zipInfo) {
zip = zipInfo;
}

int EndPoint::getZip() const {
return zip;
}

string EndPoint::toString() const {
ostringstream output;
output << fixed << setprecision(2); // two digits of precision
output << name << "\n" << address << "\n" <<
city << ", " << state << " " << zip;
return output.str();
}
string EndPoint::getState() const { return state; }
Package::Package(const string& senderInfo, const string& receiverInfo, double weightInfo, double costPerOzInfo) {
sender = senderInfo; // should validate
receiver = receiverInfo; // should validate
weight = weightInfo; // should validate
costPerOz = costPerOzInfo;
}void Package::setSender(const string& senderInfo) {
sender = senderInfo; // should validate
}string Package::getSender() const { return sender; }void Package::setReceiver(const string& receiverInfo) {
receiver = receiverInfo; // should validate
}string Package::getReceiver() const { return receiver; }void Package::setWeight(double weightInfo) {
if (weightInfo < 0.0) {
throw invalid_argument("The package weight must be >= 0.0");
}

weight = weightInfo;
}double Package::getWeight() const { return weight; }void Package::setCostPerOz(double costPerOzInfo) {

costPerOz = costPerOzInfo;
}double Package::getCostPerOz() const {
return costPerOz;
}double Package::calculateCost() const {
return weight * costPerOz;
}string Package::toString() const {
ostringstream output;
output << fixed << setprecision(2); // two digits of precision
output << "From:\n" << sender << "\n\nTo:\n" << receiver <<
"\n\nWeight: " << weight << endl <<
"\nShipping cost: " << calculateCost();
return output.str();
}

main.cpp

#include <iostream>
#include <iomanip>
#include "stdafx.h"//#include "TwoDayPackage.h"//#include "OvernightPackage.h"#include "Package.h"using namespace std;

int main()
{
// Three address records.

EndPoint homer{ "Homer Simpson", "742 Evergreen Terrace", "Springfield",
"FL", 32401 };

EndPoint donald{ "Donald Duck", "1313 Webfoot Walk", "Duckburg",
"CA", 95501};

EndPoint kermit{ "Kermit Frog", "On the Swamp", "Leland", "MS", 38756 };

// This calls the base class constructor (regular fee).

Package regular{ homer, donald, 25.0, 0.20 };

// Defines output precision for floating point numbers (iomanip).

cout << fixed << setprecision(2);

// Prints package parameters.

cout << "Regular package processed." << endl;
cout << regular.toString();
cout << "Shipping Cost: $" << regular.calculateCost() << endl << endl;

// First derived class (two-day fee added).

/* TwoDayPackage twoday{ donald, kermit, 17.5, 0.20, 2.0 };

cout << "Two-day package processed." << endl;
cout << twoday.toString();
cout << "Shipping Cost: $" << twoday.calculateCost() << endl << endl;

// Second derived class (overnight fee added).

OvernightPackage overnight{ kermit, homer, 14.2, 0.20, 0.50 };

cout << "Overnight package processed." << endl;
cout << overnight.toString();
cout << "Shipping Cost: $" << overnight.calculateCost() << endl << endl;
*/
}

Я закомментировал здесь блоки кода, так как я пытаюсь заставить работать первую часть, прежде чем углубляться в остальные.

Редактировать:

Спасибо всем за совет! Я сделал некоторые изменения и вынул тонну дополнительного кода (геттеры и сеттеры. Я учился с помощью Java …), и я получил программу для компиляции и работы, как задумано, за исключением небольшой, но важной проблемы.

-3

Решение

Ни один экземпляр конструктора «Package :: Package» не соответствует аргументу
Типы аргументов списка: (EndPoint, EndPoint, double, double)

в вашем коде:
Package regular{ homer, donald, 25.0, 0.20 };
вы передаете неправильные переменные в параметры конструктора, который является объектом Endpoint для первого и второго параметра

что у вас есть:

Package(const std::string&, const std::string&, double = 0.0, double = 0.0);

который принимает объект std :: string для первого и второго параметра.

невозможно преобразовать из списка инициализаторов в пакет

решение проблемы 1 это исправит

я не знаю, почему вы получаете 3-й, так как у вас есть iomanip в вашем основном

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector