私はC++の遺産と多型の仕組みに取り組んでいます。私は私の観点からは決して問題がありません。
実際に私は推測している、私は何かが非常にシンプルに恋しいですが、私はそれが何であるか理解できません。
誰かが私を助けてくれますか?ここでC++一般的な継承の誤解
は問題です:
私はArticle
という名前の基本クラスを持っているとArticle.Article
のテーブルを管理ArticleEnSolde
という名前の派生クラスと、第三のクラスCaddy
のみstring
とint
とArticleEnSolde
割引制度がありますが含まれていますパーセンテージに基づいて
Caddy
にはArticle
テーブルのみが含まれ、商品価格の合計を返すprixTotal()
というメソッドがあります。
しかし、私はどのようにしてオブジェクトがすべてと見なされるのかを把握することはできませんが、ArticleEnSolde`とはみなされません。
合計が正しくありません。ここで
#include "ArticleEnSolde.hpp"
ArticleEnSolde::ArticleEnSolde(string s,float f,float i):Article(s,f),remise(i){}
float ArticleEnSolde::get_remise() const{
return this->remise;
}
void ArticleEnSolde::set_remise(float r){
this->remise = r;
}
float ArticleEnSolde::getPrix(){
cout << "ArticleEnSolde " << endl;
Article * p = this;
return p->getPrix() * (1 - this->get_remise());
}
ostream& operator<<(ostream& o ,ArticleEnSolde& a){
Article * p = &a;
o <<"nom ArticleEnSolde " << p->get_nom() << " prix : " << p->getPrix() << " remise : " << a.get_remise() << " prix apres reduction " << a.getPrix();
return o;
}
ArticleEnSolde.cpp
ここ
#include "Article.hpp"
#pragma once
class ArticleEnSolde : public Article{
private:
float remise;
public:
ArticleEnSolde(string,float,float);
float get_remise() const;
void set_remise(float);
float getPrix();
friend ostream& operator<<(ostream&,ArticleEnSolde&);
};
ArticleEnSolde.hpp
ここ#include "Article.hpp"
Article::Article(string n,float p):nom(n),prix(p){}
void Article::set_nom(string s){
this->nom = s;
}
void Article::set_prix(float p){
this->prix = p;
}
string Article::get_nom() const{
return this->nom;
}
float Article::getPrix() const{
return this->prix;
}
ostream& operator<<(ostream& o ,Article& a){
o << "nom article : " << a.get_nom() << " prix : " << a.getPrix();
return o;
}
Article::~Article(){
cout << "appel du destructeur d'article " << endl;
}
Article.cpp
されている#include <iostream>
#pragma once
using namespace std;
class Article{
private:
string nom;
float prix;
public:
Article(string = "vide",float = -44.6);
void set_nom(string);
void set_prix(float);
string get_nom() const;
virtual float getPrix() const;
friend ostream& operator<<(ostream&,Article&);
virtual ~Article();
};
Article.hpp
ですここでここCaddy.hpp
#include "Article.hpp"
#include "ArticleEnSolde.hpp"
class Caddy{
private:
Article ** tableau;
int index;
int taille_max;
public:
Caddy(int);
Article** get_tab();
int get_index() const;
void set_index(int);
int get_taille_max() const;
Article* get_article(int);
void add_article(Article&);
float prixTotal();
friend ostream& operator<<(ostream&,Caddy&);
// ~Caddy();
};
あるCaddy.cpp
#include "Caddy.hpp"
Caddy::Caddy(int i):taille_max(i),index(0){
tableau = new Article *[i];
}
Article** Caddy::get_tab(){
return this->tableau;
}
int Caddy::get_index() const{
return this->index;
}
void Caddy::set_index(int a){
this->index = a;
}
int Caddy::get_taille_max() const{
return this->taille_max;
}
Article* Caddy::get_article(int a){
return this->tableau[a];
}
void Caddy::add_article(Article& a){
if(this->index <this->taille_max){
cout << "inferieur" << endl;
this->tableau[this->index++] = &a;
cout << "ajout reussi" << endl;
cout << this->index << endl;
}
else{
cout << "ajout refuse " << endl;
}
}
float Caddy::prixTotal(){
float somme = 0;
for(int i =0;i<this->get_index();i++){
cout << this->get_tab()[i]->getPrix() << endl;
}
return somme;
}
ostream& operator<<(ostream& o,Caddy& c){
for(int i = 0 ;i<c.get_index();i++){
o << "Case " << i <<" " << c.get_tab()[i] << endl;
}
return o;
}
/*
Caddy::~Caddy(){
cout << "appel du destructeur " << endl;
for(int i = 0 ; i < this->get_index();i++){
this->get_tab()[i].~Article();
}
}
*/
され、最終的にここでの主なコードである:「私は終わりにしたい
#include "Article.hpp"
#include "ArticleEnSolde.hpp"
#include "Caddy.hpp"
int main(){
Article a("a",12);
ArticleEnSolde b("b",15,0.2);
cout << a << endl;
cout << b << endl;
Caddy c(2);
c.add_article(a);
c.add_article(b);
cout << c << endl;
cout << "prix total : " << c.prixTotal() << endl;
}
は、賞金合計24 "の代わりに27誰かが私を助けることができますか?
おかげで一見
あなたは意味[「継承」](http://ell.stackexchange.com/questions/22529 /遺産と継承)。 –
はい違いがあったのは分かりませんでした – kevin556
ArticleEnSolde :: getPrix()はちょっと再帰的です(幸いにも実際には呼び出されません)...代わりにメンバーのveariablesを使用してみませんか? –