carlosmay Temat założony przez niniejszego użytkownika |
[C++] Tablica w konstruktorze klasy » 2015-08-06 00:59:58 Witam forumowiczów. Taka klasa: class Sales { private: double m_sales[ Quarters ]; double m_averages; double m_max; double m_min; double Max( const double ar[] ) const; double Min( const double ar[] ) const; double Aver( const double ar[] ) const; public: Sales(); Sales( const double ar[] ); ~Sales(); Sales * SetSales(); void Show(); };
Takie konstruktory: Sales::Sales() : m_averages( 0 ) , m_max( 0 ) , m_min( 0 ) { for( int i = 0; i < Quarters; ++i ) m_sales[ i ] = 0; }
Sales::Sales( const double ar[] ) : m_averages( Aver( ar ) ) , m_max( Max( ar ) ) , m_min( Min( ar ) ) { for( int i = 0; i < Quarters; ++i ) m_sales[ i ] = ar[ i ]; }
Tablica jest mała, np: 4 elementy. double temp[ Quarters ] = { 11897.15, 22658.24, 78533.39, 44784.41 }; Sales y2014( temp );
Pytanie: Czy tablicę muszę wypełniać w klamrach, czy jest może jakiś sposób wypełnienia jej po dwukropku ( w liście inicjalizacyjnej)? |
|
Lora |
» 2015-08-06 14:51:59 Z klasycznymi tablicami chyba się tak nie da, mógłbyś co najwyżej zamienić tablicę na wskaźnik. Możesz jednak użyć kontenera array: #include <array>
class Sales { private: std::array < double, Quarters > m_sales; public: Sales(); Sales( std::array < double, Quarters > ar ); };
Sales::Sales( std::array < double, Quarters > ar ) : m_averages( Aver( ar ) ) , m_max( Max( ar ) ) , m_min( Min( ar ) ) , m_sales( ar ) { }
Ewentualnie mógłbyś zrobić coś takiego, ale przy większych tablicach nie byłoby to zbyt wygodne: Sales::Sales( const double ar[] ) : m_averages( Aver( ar ) ) , m_max( Max( ar ) ) , m_min( Min( ar ) ) , m_sales { ar[ 0 ], ar[ 1 ], ar[ 2 ], ar[ 3 ] } { }
|
|
carlosmay Temat założony przez niniejszego użytkownika |
» 2015-08-06 15:37:35 Drugi sposób sprawdzałem i od razu wywala błędami. Wieczorkiem podrzucę jakie błędy.
|
|
Lora |
» 2015-08-06 16:03:26 Drugi sposób jest dostępny od standardu c++11. Może twój kompilator go nie obsługuje. |
|
carlosmay Temat założony przez niniejszego użytkownika |
» 2015-08-06 16:39:31 Na pewnie nie. Narazie jadę na Visual 2013. |
|
michal11 |
» 2015-08-06 19:07:16 Wstaw kod i błędy. Visual 2013 na pewno obsługuje standardowe kontenery. |
|
carlosmay Temat założony przez niniejszego użytkownika |
» 2015-08-06 22:07:00 Plik Sales.h #ifndef SALES_H #define SALES_H
namespace SALES { const int Quarters = 4; class Sales { private: double m_sales[ Quarters ]; double m_averages; double m_max; double m_min; double Max( const double ar[] ) const; double Min( const double ar[] ) const; double Aver( const double ar[] ) const; public: Sales(); Sales( double ar[] ); ~Sales(); Sales * SetSales(); void Show(); }; }
#endif
Plik Sales.cpp #include <iostream> #include "Sales.h"
using std::cout; using std::cin; using std::endl; using namespace SALES;
Sales::Sales() : m_averages( 0 ) , m_max( 0 ) , m_min( 0 ) , m_sales { 0, 0, 0, 0 } { }
Sales::Sales( double ar[] ) : m_averages( Aver( ar ) ) , m_max( Max( ar ) ) , m_min( Min( ar ) ) , m_sales { ar[ 0 ], ar[ 1 ], ar[ 2 ], ar[ 3 ] } { }
Sales::~Sales() { }
double Sales::Max( const double ar[] ) const { double max = ar[ 0 ]; for( int i = 1; i < Quarters; ++i ) if( ar[ i ] > max ) max = ar[ i ]; return max; }
double Sales::Min( const double ar[] ) const { double min = ar[ 0 ]; for( int i = 1; i < Quarters; ++i ) if( ar[ i ] < min ) min = ar[ i ]; return min; }
double Sales::Aver( const double ar[] ) const { double sum = 0; for( int i = 0; i < Quarters; ++i ) sum += ar[ i ]; return sum / Quarters; }
Sales * Sales::SetSales() { for( int i = 0; i < Quarters; ++i ) { cout << "Podaj sprzedaz za " << i + 1 << " kwartal: "; cin >> this->m_sales[ i ]; } cout << endl; this->m_averages = Aver( m_sales ); this->m_max = Max( m_sales ); this->m_min = Min( m_sales ); return this; }
void Sales::Show() { cout.precision( 2 ); cout.setf( std::ios::showpoint ); cout.setf( std::ios::fixed ); cout << "\t\tMax sprzedaz: " << m_max << endl; cout << "\t\tMin sprzedaz: " << m_min << endl; cout << "\t\tAver sprzedaz: " << m_averages << endl; }
Plik useSales.cpp #include <iostream> #include "Sales.h"
int main() { using namespace SALES; double temp[ Quarters ] = { 11897.15, 22658.24, 78533.39, 44784.41 }; Sales y2014( temp ); Sales y2015; Sales * p_y2015 = & y2015; p_y2015->SetSales(); std::cout << "ROK ROZLICZENIOWY 2014" << std::endl; y2014.Show(); std::cout << "ROK ROZLICZENIOWY 2015" << std::endl; y2015.Show(); std::cout << std::endl; system( "pause" ); }
Błędy: Error 1 error C2536: 'SALES::Sales::SALES::Sales::m_sales' : cannot specify explicit initializer for arrays //ścieżka do pliku Error 2 error C2536: 'SALES::Sales::SALES::Sales::m_sales' : cannot specify explicit initializer for arrays //ścieżka do pliku
Jak usunę tablicę z listy i odkomentuję wypełnianie tablicy w klamrach wszystko jest ok. O kontenerze array muszę poczytać, bo na razie jakieś cuda mi wychodzą. Edit: Jutro porobię jakieś próby. Padam z nóg. Jak będę miał coś konstruktywnego to się podzielę. Jak nie ruszę array to zadziałam z vectorem. |
|
michal11 |
» 2015-08-06 22:28:34 Kod ze std::array miałeś wrzucić. Możesz też skorzystać ze std::vector. |
|
« 1 » 2 |