【发布时间】:2020-01-12 13:38:02
【问题描述】:
我是 C++ 的新手,我正在编写下面的代码。
这是DOCUMENT.h:它运行良好,因此我没有发布它的实现(document.cpp):
#pragma once
#include "stdafx.h"
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
class Document {
private:
int id;
char *titre;
public:
Document();
Document(int id, char *titre);
~Document();
Document(const Document &doc);
Document operator+( Document doc);
Document operator=(const Document &doc);
void setId(int id);
int getId();
void setTitre(char *titre);
char *getTitre();
};
class Livre :public Document {
private:
float price;
public:
Livre();
Livre(int id , char *titre,float price);
~Livre();
Livre( Livre &doc);
Livre operator+(Livre doc);
Livre operator=( Livre &doc);
void setPrice(float price);
virtual float getPrice();
};
class Article :public Document {
private:
char *date;
public:
Article();
Article(int id, char *titre , char *date);
~Article();
Article(Article &doc);
Article operator+( Article &doc);
Article operator=( Article &doc);
void setDate(char* date);
char *getDate();
};
MANAGER.H:
#include "Document.h"
class Manager {
private:
Document **doc ;
public:
int count = 0;
Manager();
~Manager();
int ajouter(Document *d);
void afficher();
};
MANAGER.CPP:
#include "stdafx.h"
#include "Manager.h"
Manager::Manager() {}
Manager::~Manager() {}
int Manager::ajouter(Document *d) {
if (count == 0) {
doc = (Document**)malloc( sizeof(Document));
doc[count] = new Document();
doc[0] = d;
}
else {
doc = (Document**)realloc(doc, count * sizeof(Document));
doc[count] = new Document();
doc[count] = d;
}
count++;
return 0;
}
void Manager::afficher() {
for (int i = 0; i < count; i++) {
printf("\nid : %d \n", doc[i]->getId());
printf("titre : %s \n", doc[i]->getTitre());
printf("Price : %f \n", doc[i]->getPrice());
}
}
我的问题出在afficher() 函数中。我想从那里打电话给getprice(),但是getprice() 不是Document 类的成员:它是Livre 类的成员(它是Document 的孩子)。有什么方法可以拨打getprice() 吗?
【问题讨论】:
-
malloc和realloc使用不正确。如果你想以你描述的方式使用它,文档应该有一个virtual float getPrice();(可能应该是const)。 -
由于您使用了
malloc和realloc,您的程序具有未定义的行为。两者的有效用途在 C++ 中非常罕见,我建议您忘记它们的存在。作为初学者,您正确使用它们的可能性很小。始终使用new[],或者更确切地说,根本不使用动态分配,而是使用std::vector和std::string(以及std::unique_ptr用于单个对象分配)。您几乎不必使用new/delete。 -
this 会回答您的问题吗?如果您需要更多解释,我可以将其变成完整的答案。
-
如果要调用
Livre的成员函数,需要创建Livre类型的对象,而不是其基类Document。您希望Manager持有指向Document和Livre实例的指针还是只持有后者?如果是前者,如果doc[i]不 指向Livre类型的对象,你想发生什么?
标签: c++ oop inheritance