C++ 分段故障重载运算符<&书信电报;
我的代码编译得很好。但是当我尝试在声明数组时使用重载运算符时:C++ 分段故障重载运算符<&书信电报;,c++,c,overloading,C++,C,Overloading,我的代码编译得很好。但是当我尝试在声明数组时使用重载运算符时: Stock stocks[STKS] = ... 数组元素通过STKS-1索引0。当您访问此行中的stocks[stk]时: os << "Company: " << s.company std::cout<<stocks[STKS]; // Out-of-bounds: STKS > STKS - 1 std::无法确定为什么要避免在标题中使用#include。这是一种正常的做法。我
Stock stocks[STKS] = ...
数组元素通过STKS-1
索引0
。当您访问此行中的stocks[stk]
时:
os << "Company: " << s.company
std::cout<<stocks[STKS]; // Out-of-bounds: STKS > STKS - 1
std::无法确定为什么要避免在标题中使用#include
。这是一种正常的做法。我不知道。我在某个地方感到愤怒,认为这样做是不对的,最好避免这种做法。所以,如果我在头文件中包含iostream,然后在使用头文件的代码中包含iostream,就可以了?这不会有什么不好的地方吗???请参阅的答案,以获得比我的评论更好的解释。:-)哦,我真是个笨蛋。一遍又一遍地看代码,没有注意到那个简单的错误……非常感谢@不客气。既然你是新来的,请别忘了标出对解决问题最有帮助的答案。看到了吗?
// stock20.cpp -- augmented version
#include "stock20.h"
#include <cstring>
#define my_delete(x){ delete[] x; x = NULL; }
using namespace std;
// constructors
Stock::Stock() // default constructor
{
company = new char[1];
company[0] = '\0';
shares = 0;
share_val = 0.0;
total_val = 0.0;
}
Stock::Stock(const char* co, long n, double pr)
{
company = new char[strlen(co)+1];
strcpy(company,co);
if (n < 0)
{
std::cout << "Number of shares can't be negative; "
<< company << " shares set to 0.\n";
shares = 0;
}
else
shares = n;
share_val = pr;
set_tot();
}
// class destructor
Stock::~Stock() // quiet class destructor
{
my_delete(company);
}
// other methods
void Stock::buy(long num, double price)
{
if (num < 0)
{
std::cout << "Number of shares purchased can't be negative. "
<< "Transaction is aborted.\n";
}
else
{
shares += num;
share_val = price;
set_tot();
}
}
void Stock::sell(long num, double price)
{
using std::cout;
if (num < 0)
{
cout << "Number of shares sold can't be negative. "
<< "Transaction is aborted.\n";
}
else if (num > shares)
{
cout << "You can't sell more than you have! "
<< "Transaction is aborted.\n";
}
else
{
shares -= num;
share_val = price;
set_tot();
}
}
void Stock::update(double price)
{
share_val = price;
set_tot();
}
std::ostream& operator<<(std::ostream& os, const Stock& s)
{
using std::ios_base;
// set format to #.###
ios_base::fmtflags orig =
os.setf(ios_base::fixed, ios_base::floatfield);
std::streamsize prec = os.precision(3);
os << "Company: " << s.company
<< " Shares: " << s.shares << '\n';
os << " Share Price: $" << s.share_val;
// set format to #.##
os.precision(2);
os << " Total Worth: $" << s.total_val << '\n';
// restore original format
os.setf(orig, ios_base::floatfield);
os.precision(prec);
return os;
}
const Stock & Stock::topval(const Stock & s) const
{
if (s.total_val > total_val)
return s;
else
return *this;
}
// usestok2.cpp -- using the Stock class
// compile with stock20.cpp
#include "stock20.h"
const int STKS = 4;
int main()
{{
//create an array of initialized objects
Stock stocks[STKS] = {
Stock("NanoSmart", 12, 20.0),
Stock("Boffo Objects", 200, 2.0),
Stock("Monolithic Obelisks", 130, 3.25),
Stock("Fleep Enterprises", 60, 6.5)
};
std::cout << "Stock holdings:\n";
int st;
for (st = 0; st < STKS; st++)
std::cout<<stocks[STKS]; //here we got an error
// set pointer to first element
const Stock * top = &stocks[0];
for (st = 1; st < STKS; st++)
top = &top->topval(stocks[st]);
// now top points to the most valuable holding
std::cout << "\nMost valuable holding:\n";
std::cout<<*top;}
// std::cin.get();
return 0;
}
Stock stocks[STKS] = ...
std::cout<<stocks[STKS]; // Out-of-bounds: STKS > STKS - 1