【发布时间】:2013-10-12 09:10:52
【问题描述】:
我还没有完全理解抽象基类。这是我为我的作业创建的,它似乎主要工作,除了它不会返回通过派生类添加的任何内容。每当我选择 hasDMA 或 lacksDMA 时,我都不会得到颜色或样式返回的结果。
Main.cpp
#include <iostream>
#include <conio.h>
#include "DMA.h"
using namespace std;
const int RECORDS = 1;
const int LEN = 40;
int main()
{
ABC * p_records[RECORDS];
int i;
for (i = 0; i < RECORDS; i++)
{
char temp[LEN];
int temprate;
char choice;
cout << "\nEnter label name: ";
cin.getline(temp, LEN);
cout << "Enter Rating: ";
cin >> temprate;
cout << "Enter 1 for lacksDMA or 2 for hasDMA: ";
while (cin >> choice && (choice != '1' && choice != '2'))
cout << "Enter 1, 2: ";
if (choice == '1')
{
char tempcolor[LEN];
cout << "Enter the color: ";
cin.getline(tempcolor, LEN);
p_records[i] = new lacksDMA(temp, temprate, tempcolor);
}
else
{
char tempstyle[LEN];
cout << "Enter the style: ";
cin.getline(tempstyle, LEN);
p_records[i] = new hasDMA(tempstyle, temp, temprate);
}
while (cin.get() != '\n')
continue;
}
cout << endl;
for (i = 0; i < RECORDS; i++)
{
p_records[i]->View();
cout << endl;
}
for (i = 0; i < RECORDS; i++)
{
delete p_records[i];
}
cout << "\nPress any key to continue...";
cin.sync();
_getch();
return 0;
}
DMA.cpp
#include "DMA.h"
using namespace std;
ABC::ABC(const char * l, int r)
{
label = new char [strlen(l) + 1];
strcpy(label, l);
rating = r;
}
ABC::ABC(const ABC & rs)
{
label = new char[strlen(rs.label) + 1];
strcpy(label, rs.label);
rating = rs.rating;
}
ABC::~ABC()
{
}
ABC & ABC::operator=(const ABC & rs)
{
if (this == &rs)
return *this;
delete [] label;
label = new char[strlen(rs.label) + 1];
strcpy(label, rs.label);
rating = rs.rating;
return *this;
}
ostream & operator<<(ostream & os, const ABC & rs)
{
rs.View();
return os;
}
void ABC::View() const
{
cout << "\nLabel: " << label << endl;
cout << "Rating: " << rating << endl;
}
baseDMA::baseDMA(const char * l, int r) : ABC(l,r)
{
}
lacksDMA::lacksDMA(const char * l, int r, const char * c) : ABC(l,r)
{
strncpy(color, c, 39);
color[39] = '\0';
}
lacksDMA::lacksDMA(const ABC &rs, const char * c) : ABC(rs)
{
strncpy(color, c, 39);
color[39] = '\0';
}
void lacksDMA::View() const
{
ABC::View();
cout << "Color: " << color << endl;
}
hasDMA::hasDMA(const char * s, const char * l, int r) : ABC(l,r)
{
style = new char [strlen(s) + 1];
strcpy(style, s);
}
hasDMA::hasDMA(const char * s, const ABC & rs) : ABC(rs)
{
style = new char [strlen(s) + 1];
strcpy(style, s);
}
hasDMA::hasDMA(const hasDMA & hs) : ABC(hs)
{
style = new char [strlen(hs.style) + 1];
strcpy(style, hs.style);
}
hasDMA::~hasDMA()
{
delete [] style;
}
void hasDMA::View() const
{
ABC::View();
cout << "Style: " << style << endl;
}
DMA.h
#ifndef DMA_H_
#define DMA_H_
#include <iostream>
using namespace std;
// Abstract Base Class
class ABC
{
private:
char * label;
int rating;
public:
ABC(const char * l = "null", int r = 0);
ABC(const ABC & rs);
virtual ~ABC() = 0;
virtual ABC & operator=(const ABC & rs);
virtual void View() const;
friend ostream & operator<<(ostream & os, const ABC & rs);
};
// Former Base Class Using DMA
class baseDMA: public ABC
{
private:
public:
baseDMA(const char * l = "null", int r = 0);
};
// derived class without DMA
// no destructor needed
// uses implicit copy constructor
// uses implicit assignment operator
class lacksDMA : public ABC
{
private:
char color[40];
public:
lacksDMA(const char * l = "null", int r = 0, const char * c = "blank");
lacksDMA(const ABC & rs, const char * c);
virtual void View() const;
};
// derived class with DMA
class hasDMA : public ABC
{
private:
char * style;
public:
hasDMA(const char * s = "none", const char * l = "null", int r = 0);
hasDMA(const char * s, const ABC & rs);
hasDMA(const hasDMA & hs);
~hasDMA();
hasDMA & operator = (const hasDMA & rs);
void View() const;
};
#endif
【问题讨论】:
-
这代码太多了。请发布您认为问题所在的部分。
-
std::string和std::vector怎么样???您的代码充满了动态分配......上帝帮助那些必须调试它的人。 -
我没有看到代码有任何问题(除了你应该在
ABC::~ABC()中使用delete[] label,或者最好让它成为std::string)。确保您的代码与此处发布的代码相同。此外,描述示例输入、预期输出和实际输出。 -
确保在您的代码中
ABC::View确实声明为virtual,并且该关键字const要么在所有 3 个函数签名中,要么不在其中。这是最重要的部分。 -
当我运行它并输入标签测试,评级为 10,缺少 DMA 选择 1,然后它会询问它应该的颜色,然后我输入红色。在那一点上,一切似乎都很顺利。但是,当显示记录时,标签和评级是正确的,但没有显示任何颜色。它只显示颜色: