Witam !
Oto kod programu :
#ifndef STOCK_H_
#define STOCK_H_
#include <string>
#include <iostream>
class Stock
{
private:
std::string * company;
int shares;
double share_val;
double total_val;
void set_tot() { total_val = shares * share_val; }
public:
Stock(); //konstruktor domyślny
Stock(const Stock &);
Stock(const std::string &, int, double ); //utworzenie konstruktorów przydzielajacych pamiec dynamiczna
~Stock();
void buy(int, double);
void sell(int, double);
void update(double);
const Stock & topval(const Stock &) const;
//zaprzyjaźnione
friend std::ostream & operator<<(std::ostream &, const Stock &); //zgadza się
};
#endif // !STOCK_H_
#include "stock.h"
#include <cstring>
//kontruktory
Stock::Stock() //kontruktor domyślny
{
company = new std::string; //alokacja pamięci
shares = 0;
share_val = 0.0;
total_val = 0.0;
}
Stock::Stock(const Stock & pr) // konstruktor kopiujacy
{
company = new std::string; // alokacja pamięci
if (pr.shares < 0)
{
std::cout << "Liczba udziałów nie może być ujemna: " << "ustalam liczbę udziałów w " << company << " na 0.\n";
shares = 0;
}
else
shares = pr.shares; // ?
share_val = pr.share_val; // ?
set_tot();
}
Stock::Stock(const std::string & co, int n = 0, double price = 0.0)
{
company = new std::string;
//company = &co;
if (n < 0)
{
std::cout << "Liczba udziałów nie może być ujemna: " << "ustalam liczbę udziałów w " << company << " na 0.\n";
shares = 0;
}
else
shares = n;
share_val = price;
set_tot();
}
Stock::~Stock() { delete company; } // nic nie robi
//pozostałe metody
void Stock::buy(int num, double price)
{
if (num < 0)
std::cout << "Liczba nabywanych udzialow nie moze byc ujemna. Transakcja Przerwana.\n";
else
{
shares += num;
share_val = price;
set_tot();
}
}
void Stock::sell(int num, double price)
{
if (num > 0)
std::cout << "Liczba sprzedawanych udzialow nie moze być ujemna. Transakcja Przerwana.\n";
else if (num > shares)
std::cout << "Nie możesz sprzedawać wiecej, udzialow, niz posiadasz! Transakcja przerwana.\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 & text) //zgadza się
{
//ustawienie formatu zmiennoprzecinkowego #.###
std::ios_base::fmtflags orig = std::cout.setf(std::ios_base::fixed, std::ios_base::floatfield);
std::streamsize prec = std::cout.precision(3);
os << "Spolka: " << text.company << " Liczba udzialow: " << text.shares << "\nCena udzialow: " << text.share_val << " zł";
//ustawienie formatu zmiennoprzecinkowego #.##
std::cout.precision(2);
os << "Laczna wartosc udzialow: " << text.total_val << " zl\n";
//przywrocenie pierwotnego formatu
std::cout.setf(orig, std::ios_base::floatfield);
std::cout.precision(prec);
return os;
}
const Stock & Stock::topval(const Stock & s) const
{
if (s.total_val > total_val)
return s;
else
return *this;
}
#include "stock.h"
#include <cstdio>
const int STKS = 4;
int main()
{
//tablica zainicjalizowanych obiektów !
Stock stocks[STKS] = {
Stock("NanoSmart", 12, 20.0),
Stock("BurakPOL", 200, 2.0),
Stock("GruzPOL", 130, 3.25),
Stock("FutroPOL", 60, 6.5)
};
std::cout << "Portfel inwestycyjny:\n";
int st;
for (st = 0; st < STKS; st++)
std::cout << stocks[st];
//ustawienie wskaźnika na pierwszy element
const Stock * top = &stocks[0];
for (st = 0; st < STKS; st++)
top = &top->topval(stocks[st]);
//teraz top wskazuje do najbardziej wartosciowych udziałów w portfelu
std::cout << "\nNajbardziej wartosciowy pakiet:\n";
std::cout << *top; // błąd w wyświetlaniu nazwy (podaje adres)..
system("pause");
return 0;
}
Program działa tak jak powinien (jeżeli chodzi o konstruktory i funkcje), problem stanowi wyświetlenie ostatniej części programu.
std::cout << *top;
Program wyświetla dane poprawne prócz nazwy typu string (na to miejsce pojawia się adres). Biorąc pod uwagę, że w klasie dany jest wskaźnik typu string na którym opiera się dalsza część programu.
Co mogę zrobić, aby program brał pod uwagę opcje wyświetlenia 'nazwy' poprawnie, a nie jego adresu ?