Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++] Tablica w konstruktorze klasy

Ostatnio zmodyfikowano 2015-08-11 23:23
Autor Wiadomość
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:
C/C++
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(); // zwraca juz wypelniony this do obiektu w main()
    void Show();
};

Takie konstruktory:
C/C++
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.
C/C++
double temp[ Quarters ] = { 11897.15, 22658.24, 78533.39, 44784.41 };
Sales y2014( temp );
Pytanie:
Czy tablicę
C/C++
m_sales[ Quarters ]
 muszę wypełniać w klamrach, czy jest może jakiś sposób wypełnienia jej po dwukropku
( w liście inicjalizacyjnej)?
P-135812
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:

C/C++
#include <array>

class Sales
{
private:
    std::array < double, Quarters > m_sales;
    //kod
public:
    Sales();
    Sales( std::array < double, Quarters > ar );
    //kod
};

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:
C/C++
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 ] }
{
   
   
}
P-135821
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.
P-135822
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.
P-135823
carlosmay
Temat założony przez niniejszego użytkownika
» 2015-08-06 16:39:31
Na pewnie nie. Narazie jadę na Visual 2013.
P-135824
michal11
» 2015-08-06 19:07:16
Wstaw kod i błędy. Visual 2013 na pewno obsługuje standardowe kontenery.
P-135825
carlosmay
Temat założony przez niniejszego użytkownika
» 2015-08-06 22:07:00
Plik Sales.h
C/C++
#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(); // zwraca juz wypelniony this do obiektu w main()
        void Show();
    };
}

#endif

Plik Sales.cpp
C/C++
#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 }
{
    /*for (int i = 0; i < Quarters; ++i)
    m_sales[i] = 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 ] }
{
    /*for (int i = 0; i < Quarters; ++i)
    m_sales[i] = ar[i];*/
}

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() // fun wypelnia pola wskaznikem this
{ // i na koniec go zwraca do main()
    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 ); // format x.xx
    cout.setf( std::ios::showpoint ); // format x.xx
    cout.setf( std::ios::fixed ); // format x.xx
   
    cout << "\t\tMax sprzedaz: " << m_max << endl;
    cout << "\t\tMin sprzedaz: " << m_min << endl;
    cout << "\t\tAver sprzedaz: " << m_averages << endl;
}

Plik useSales.cpp
C/C++
#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(); // pobiera zwrocony this
   
    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.
P-135831
michal11
» 2015-08-06 22:28:34
Kod ze std::array miałeś wrzucić. Możesz też skorzystać ze std::vector.
P-135833
« 1 » 2
  Strona 1 z 2 Następna strona