• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Wyjście wskaźnika typu string (C++)

VPS Starter Arubacloud
0 głosów
130 wizyt
pytanie zadane 7 listopada 2018 w C i C++ przez Sic Dyskutant (8,510 p.)

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 ?

komentarz 8 listopada 2018 przez j23 Mędrzec (194,920 p.)

Dlaczego company jest wskaźnikiem? Nie może być po prostu obiektem std::string?

komentarz 8 listopada 2018 przez Sic Dyskutant (8,510 p.)
Musiałem przypisać pamięć.
komentarz 9 listopada 2018 przez j23 Mędrzec (194,920 p.)
Dlaczego musiałeś?
komentarz 9 listopada 2018 przez Sic Dyskutant (8,510 p.)
Takie zadanie, celem jest ćwiczenie tworzenia konstruktora kopiującego oraz alokacja pamięci dynamicznej w nich.

2 odpowiedzi

0 głosów
odpowiedź 7 listopada 2018 przez RafalS VIP (122,820 p.)

Eh.

std::string * company;
os << "Spolka: " << text.company 

Czemu spodziewales sie ze wypisze sie string a nie adres wskaznika?

0 głosów
odpowiedź 7 listopada 2018 przez criss Mędrzec (172,590 p.)
os << "Spolka: " << text.company << " Liczba udzialow: " << text.shares << "\nCena udzialow: " << text.share_val << " zł";

Bo text.company to jest wskaźnik. Po prostu napisz *text.company. Jeśli nie jesteś pewien, że company zawsze wskazuje na jakiś obiekt, to lepiej dopisz jeszcze ifa czy company nie jest nullptr.

komentarz 8 listopada 2018 przez Sic Dyskutant (8,510 p.)
edycja 10 listopada 2018 przez Sic

Zmieniłem to wielokrotnie, jednak dalej wyświetla adres lub w przypadku *text.company pojawiają się wartości jednak bez 'nazw'.

Tak wygląda program po skompilowaniu (po zmianie na *text.company):

Podobne pytania

0 głosów
2 odpowiedzi 140 wizyt
0 głosów
0 odpowiedzi 84 wizyt
0 głosów
1 odpowiedź 1,971 wizyt
pytanie zadane 3 grudnia 2016 w C i C++ przez Tinsonu Początkujący (280 p.)

92,452 zapytań

141,262 odpowiedzi

319,078 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...