【发布时间】:2015-02-26 21:23:50
【问题描述】:
我为从基类仪器继承的子类类型股票新建了一个内存,当我尝试访问数组的第二个元素时,它会引发错误。当我的新数组大小为 1 时,一切都很好
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
class Instrument{
public:
virtual void display(){}
virtual void output(){}
virtual void readFile(){}
virtual ~Instrument(){}
};
class Stock :
public Instrument{
public:
Stock(){
}
virtual void input(){
cout << "This is stock, please input its information: ";
cin >> name >> bidPrice >> askPrice >> lastPrice >> issueExchange;
}
virtual void display(){
cout <<"This is to display stock: "<< name << " "
<< bidPrice << " "
<< askPrice << " "
<< lastPrice << " "
<< issueExchange << " "
<< endl;
}
virtual void output(){
ofstream myfile;
myfile.open("Stock.txt", ios::out | ios::app);
if (myfile.is_open()){
myfile << "This is a stock: "
<< name << " "
<< bidPrice << " "
<< askPrice << " "
<< lastPrice << " "
<< issueExchange << " "
<< endl;
}
else cout << "Unable to open file";
}
virtual void readFile(){
string line;
ifstream myfile("Stock.txt");
cout << "\nThis is file stored\n";
if (myfile.is_open())
{
while (getline(myfile, line))
{
cout << line << '\n';
}
myfile.close();
}
}
virtual ~Stock(){}
private:
char name[13];
double bidPrice;
double askPrice;
double lastPrice;
int issueExchange;
};
int main(){
const int N = 5;//it works fine if I use N=1;
Instrument *pBase = NULL;
pBase = new Stock[N];
for (int i = 0; i < N; i++){
pBase[i].input();// here throws an exception and ends the program
pBase[i].display();
pBase[i].output();
}
pBase[N - 1].readFile();
delete[] pBase;
system("pause");
return 0;
}
【问题讨论】:
-
@GermaineJason 这不是 Java 或 C#。有对象,不存在 NPE。
-
有趣,我看到了这个错误,并且很惊讶我以前从未见过这个。这几乎就像切片,但又有所不同。 @GermaineJason 数组中有 5 个对象。
-
@MooingDuck,它从字符串变成了char[13],你看到我的#include
-
问题是你正在访问一个
Stock数组,就好像它是一个Instrument数组一样。多态性在整个数组之间不起作用,您需要一个指向每个单独元素的指针。 -
@Galik:请不要在评论区回答问题。这就是 answer 部分的用途。谢谢。
标签: c++ pointers polymorphism