Keresés
Hírlevél
 
Kiemelt témák
»Hogy viszonyul ehhez a család?
»Legjobb metodika emberi relációk tárolására
»A programozó hibája, hogy törik a programját?
»Jogosultság kezelés mezőszinten
Állás/munka
»Wordpress szakértőt keresünk
»Kamu álláshirdetők listája
»Front-end fejlesztő / Sitebuilder
»DataStore Developer
»PHP programozó, webfejlesztő munkát keres
» több téma
Tudástár
Oldalon keresés 8x írja ki az eredményt
?XML-ből sok szövegmező
?Input mezőből visszakapott adat probléma
TinyMCE és az ékezetek
?Rengeteg hasonló kép betöltése gyorsan (PHP)
Ékezetes kar. nem minden táblában jól
?Shelltreeview gond
Grafikon rajzolás probléma
?Onclick= php függvény
?Egyenes megrajzolása
?Access-ből adott xml fájl kinyerése
Listázás időpont szerint
Exportálás változó könyvtárba
*Link eredményének kiolvasása
Imagemapre képet
» több téma
Társalgó
»A programozásból jól meg lehet élni?
»MFC tanulás
»Könyvet adok-veszek
»Hogy viszonyul ehhez a család?
»Nintendo wii
»Letölthető az új Rad Studio XE és Delphi XE
»Weblap véleményezés
»Játékmotor elmélet
»Informatikai bulvárlap
»Delphi-ről C++-ra váltás
» több téma
ASP  |  C#  |  C++  |  CSS  |  Delphi  |  Flash  |  HTML  |  Java  |  JavaScript  |  Pascal  |  Perl  |  PHP  |  Python  |  Visual Basic  |  Visual C++  |    »    

Tudástár

»

Statikus adattag

»

Statikus adattag

nyitotta: Kumar, idő: 2010.03.12., moderátor: moderator
  Értesítés változás esetén Felvétel kedvencekhez Küldés emailben Nyomtatható verzió

Kategóriák:Programozási nyelvek » C++

Sorrend:
Időzóna:
Blokkméret:
Ha csinálok egy static int defvalue-t mondjuk egy class-ban a public részben

Akkor .cpp-ben hogyan tudok neki értéket adni?

Headerben:
public:
static int defvalue;

Cpp-ben:

??
Hi!

Header (A.hh):
class A
{
   public:
      static int defValue;
};

Source:
#include "A.hh"

int A::defValue = 0;

Remelem segitett!

Udv,
herf
Előrébb vagyunk de még mindig nem enged tovább:

program.cpp:9: error: conflicting declaration 'int Vektor::defErtek'
vektor.h:11: error: 'Vektor::defErtek' has a previous declaration as 'double Vektor::defErtek'
program.cpp:9: error: declaration of 'double Vektor::defErtek' outside of class is not definition
program.cpp:10: error: conflicting declaration 'double Vektor::defMeret'
vektor.h:10: error: 'Vektor::defMeret' has a previous declaration as 'int Vektor::defMeret'
program.cpp:10: error: declaration of 'int Vektor::defMeret' outside of class is not definition


Bocs hogy csak a hiba üzeneteket linkelem de ezekre ötletem sincs
Jó lenne, ha a te programodat másolnád be, ha hibát kell keresni!

Valószínűleg típuskeveredés van a programodban.
Header fájl:
/**
* Dinamikus valós vektor.
* A konstruktor a statikus tagokból inicializál
*/

class Vektor {
double *pVec; // vektor elemeit tartalmazó din. memóriaterület cime
int nElem; // vektor elmeinek száma
public:
static int defMeret; // vektor alapértelmezett mérete
static double defErtek; // vektor elemeinek alepértelmezett kezdőértéke

/// Kontsruktor.
/// @param n - vektor mérete
/// @param ertek - kezdőérték
/// default: statisus változókból inicializál
Vektor(int n = defMeret, double ertek = defErtek) {
nElem = n;
pVec = new double[nElem];
for (int i = 0; i < nElem; i++)
pVec = ertek;
}

/// Másoló konstruktor.
Vektor(const Vektor&);

/// Destruktor.
~Vektor();

/// Méret lekérdezése.
int getElemNum() const { return nElem; }

/// Értékadó operátor
Vektor& operator=(const Vektor&);

/// Indexoperátor.
double& operator[](int);

/// Szorzás: Valós * Vektor
friend Vektor operator*(double, Vektor&);
};

CPP:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <malloc.h>
#include <math.h>
#include "vektor.h"

int Vektor::defErtek=8;
double Vektor::defMeret=-23.0;

Vektor::~Vektor()
{
delete[] pVec;
}

Vektor::Vektor(const Vektor& op)
{
nElem=op.nElem;
pVec=new double(nElem);
for(int k=0;k<nElem;k++)
{
pVec[k]=op.pVec[k];
}

}
Vektor& Vektor::operator =(const Vektor& op)
{
pVec=op.pVec;
return *this;
}

double& Vektor::operator [](int k)
{
if(k<0 || k>=nElem)
throw "Hiba!";
return pVec[k];
}

Vektor operator*(double k,Vektor& op)
{
for(int i=0;i<op.nElem;i++)
op.pVec=op.pVec*k;
}
Légy szíves, a bemásolás előtt a "forráskód" gombot használni!
Header:
/**
 * Dinamikus valós vektor.
 * A konstruktor a statikus tagokból inicializál
 */

class Vektor {
    double *pVec;               // vektor elemeit tartalmazó din. memóriaterület cime
    int nElem;                  // vektor elmeinek száma
public:
    static int defMeret;        // vektor alapértelmezett mérete
    static double defErtek;     // vektor elemeinek alepértelmezett kezdőértéke

    /// Kontsruktor.
    /// @param n     - vektor mérete
    /// @param ertek - kezdőérték
    /// default: statisus változókból inicializál
    Vektor(int n = defMeret, double ertek = defErtek) {
        nElem = n;
        pVec = new double[nElem];
        for (int i = 0; i < nElem; i++)
            pVec[i] = ertek;
    }

    /// Másoló konstruktor.
    Vektor(const Vektor&);
   
    /// Destruktor.
    ~Vektor();

    /// Méret lekérdezése.
    int getElemNum() const { return nElem; }

    /// Értékadó operátor
    Vektor& operator=(const Vektor&);

    /// Indexoperátor.
    double& operator[](int);

    /// Szorzás: Valós * Vektor
    friend Vektor operator*(double, Vektor&);
};

CPP:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <malloc.h>
#include <math.h>
#include "vektor.h"

int Vektor::defErtek=8;
double Vektor::defMeret=-23.0;

Vektor::~Vektor()
{
delete[] pVec;
}

Vektor::Vektor(const Vektor& op)
{
nElem=op.nElem;
pVec=new double(nElem);
for(int k=0;k<nElem;k++)
{
pVec[k]=op.pVec[k];
}

}
Vektor& Vektor::operator =(const Vektor& op)
{
pVec=op.pVec;
return *this;
}

double& Vektor::operator [](int k)
{
if(k<0 || k>=nElem)
throw "Hiba!";
return pVec[k];
}

Vektor operator*(double k,Vektor& op)
{
for(int i=0;i<op.nElem;i++)
op.pVec[i]=op.pVec[i]*k;
}
Az láthatóan nem jól van, amiről pelz írt. A header-ben a defMeret int, és a defErtek double, míg a cpp-ben a defMeret double és a defErtek int.
!!!


int Vektor::defErtek=8;
double Vektor::defMeret=-23.0;

Helyesen:

double Vektor::defErtek = -23.0;
int Vektor::defMeret = 8;
Mindjárt a falnak megyek.

Ahh.Már csak annyi hogy ránéznétek nekem arra az = operátorra hogy az jól van-e úgy?
Nem jó, szerintem.
Mielőtt átmásolnád, fel kellene szabadítani a régi vektort. Majd létrehozni az új pVec-et, akkora darabszámban, amekkora a op-é. És egyenként átmásolni az értékeket.

Remélem sejted mi a gond. A te értékadásod után, mindét vektor az op pVec-jét fogja a destruktorban felszabadítani! A régi pVec-ről pedig mindenki elfelejtkezik!


Vektor& Vektor::operator =(const Vektor& op) {
    delete [] pVec;
    nElem = op.nElem;
    pVec = new double[nElem];
    for (int i = 0; i < nElem; i++) {
        pVec[i] = op.pVec[i];
    }
    return *this;
}
Most már nemtudom mi nem tetszik még neki:


// Beolvasa n-et (egész)
    int n; cin >> n;
    Vektor::defMeret = n;   // ez lesz a default méret
    // Beolvassa a default kezdőértéket
    cin >> Vektor::defErtek;
    // Beolvas még egy egész értéket (ezzel kicst módosít majd)
    int k = 0; cin >> k;

    // Létrehozunk egy 4xn-es mátrixot default értékekkel;
    const int m = 4;
    Vektor vt[m];

    cout << fixed;
    for (int i = 0; i < m; i++) {
        // Értékadás próbája
        v0 = vt[i];
        for (int j = 0; j < n; j++)
           v0[j] = v0[j] * k++;

        cout << "vt[" << i << "](" << v0.getElemNum() << "): ";
 
        // Szorzás probája
        vt[i] = 10 * v0;
        for (int j = 0; j < n; j++)
           cout << setw(8) << setprecision(0) << vt[i][j];
        cout << endl;
    }
  } catch (...) {   // mindent elkapunk
    cout << "Nagy baj van" << endl;
  }
#ifdef _CRTDBG_MAP_ALLOC
  _CrtDumpMemoryLeaks();  // ellenőrzi, hogy volt-e memóriaszivárgás
#endif

Vhol itt szál el mert az elkap vhol egy hibát
Mennyit adsz meg "n" értékének, amikor futtatod?
az a baj hogy nem én futtatom hanem egy netes gcc fordító.
Ez csak a kód ami alapján ellenőriz.
Ez a baj!
Akkor a netes ellenőrző progi, nem biztos, hogy n=4 -et ad neki!
Márpedig ez a program csak akkor futhat le "helyesen", ha n = 4-et adsz meg neki!
vegyük az ideális esetet és ha n=4 akkor mégis miért megy bele a catch-ba??Gondolom vmelyik operátor rossz csak nemtudom hgy melyik

De sztem vhol szivárog a memória csak nemtudom hogy miért és hogy hol
Ez mindenképp problémás!

        v0 = vt[i];
        for (int j = 0; j < n; j++)
           v0[j] = v0[j] * k++;

A v0-t egyszer úgy használod mintha, egy önálló objektum lenne, aztán pedig úgy mintha tömb lenne!
Mutasd a v0 eredeti deklarációját!
itt a teljes main:

int main() {
  try {
    // Konstruktorok és az indexelés tesztje
    Vektor v0;
    cout << "v0 merete: "<< v0.getElemNum() << " v0[0]: " << v0[0] << endl;

    Vektor v1(5, -1), v2(6, 0);
    cout << "v1 merete: "<< v1.getElemNum() << " v1[4]: " << v1[4] << endl;

    Vektor v3 = v2;
    cout << "v3 merete: "<< v3.getElemNum() << " v3[5]: " << v3[5] << endl;
   
    // indexelési hiba 1. teszt
    try {
       v3[6];
       cout << "Hoppa" << endl;
    } catch (const char *) {
       cout << "Jol van" << endl;
    }
    // indexelesi hiba 2. teszt
    try {
       v3[-1];
       cout << "Hoppa2" << endl;
    } catch (const char *) {
       cout << "Jol van2" << endl;
    }

    // Beolvasa n-et (egész)
    int n; cin >> n;
    Vektor::defMeret = n;   // ez lesz a default méret
    // Beolvassa a default kezdőértéket
    cin >> Vektor::defErtek;
    // Beolvas még egy egész értéket (ezzel kicst módosít majd)
    int k = 0; cin >> k;

    // Létrehozunk egy 4xn-es mátrixot default értékekkel;
    const int m = 4;
    Vektor vt[m];

    cout << fixed;
    for (int i = 0; i < m; i++) {
        // Értékadás próbája
        v0 = vt[i];
        for (int j = 0; j < n; j++)
           v0[j] = v0[j] * k++;

        cout << "vt[" << i << "](" << v0.getElemNum() << "): ";
 
        // Szorzás probája
        vt[i] = 10 * v0;
        for (int j = 0; j < n; j++)
           cout << setw(8) << setprecision(0) << vt[i][j];
        cout << endl;
    }
  } catch (...) {   // mindent elkapunk
    cout << "Nagy baj van" << endl;
  }
#ifdef _CRTDBG_MAP_ALLOC
  _CrtDumpMemoryLeaks();  // ellenőrzi, hogy volt-e memóriaszivárgás
#endif
  return 0;
}

Header-t és az operátorokat őedig már felírtam. Ez minden

A fordító azt a hibát dobja hogy memó szivárgás...Nem írja hogy hol csak bele megy az utolsó catch-ba, de előtte azt írja ki amit ki kell neki ha jól vannak megírva az operátorok.
vektor.h
#ifndef _VEKTOR_H
#define _VEKTOR_H

class Vektor {
    double* pVec; // vektor elemeit tartalmazó din. memóriaterület cime
    int nElem; // vektor elmeinek száma

public:
    static int defMeret; // vektor alapértelmezett mérete
    static double defErtek; // vektor elemeinek alepértelmezett kezdőértéke

    Vektor(int n = defMeret, double ertek = defErtek) {
    nElem = n;
    pVec = new double[nElem];
    for (int i = 0; i < nElem; i++)
        pVec[i] = ertek;
    }

    /// Másoló konstruktor.
    Vektor(const Vektor&);

    /// Destruktor.
    ~Vektor();

    /// Méret lekérdezése.
    int getElemNum() const {return nElem;}

    /// Értékadó operátor
    Vektor& operator=(const Vektor&);

    /// Indexoperátor.
    double& operator[](int);

    /// Szorzás: Valós * Vektor
    friend Vektor& operator*(double, Vektor&);
}; // class

#endif /* _VEKTOR_H */

vektor.cpp
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <malloc.h>
#include <math.h>
#include "vektor.h"

double Vektor::defErtek = -23.0;
int Vektor::defMeret = 8;

Vektor::~Vektor() {
    delete [] pVec;
}

Vektor::Vektor(const Vektor& op) {
    nElem = op.nElem;
    pVec = new double(nElem);
    for (int k = 0; k < nElem; k++) {
        pVec[k] = op.pVec[k];
    }
}

Vektor& Vektor::operator=(const Vektor& op) {
    delete [] pVec;
    nElem = op.nElem;
    pVec = new double[nElem];
    for (int i = 0; i < nElem; i++) {
        pVec[i] = op.pVec[i];
    }
    return *this;
}

double& Vektor::operator[](int k) {
    if(k < 0  ||  k >= nElem)
        throw "Hiba!";
    return pVec[k];
}

Vektor& operator*(double k, Vektor& op) {
    for (int i = 0; i < op.nElem; i++)
        op.pVec[i] = op.pVec[i] * k;
    return op;
}

a main kritikus részlete:
    // Létrehozunk egy 4xn-es mátrixot default értékekkel;
    const int m = 4;
    Vektor vt[4];

    cout << fixed;
    for (int i = 0; i < m; i++) {
        // Értékadás próbája
        //Vektor v0;
        v0 = vt[i];
        for (int j = 0; j < n; j++)
           v0 = k++ * v0;

        cout << "vt[" << i << "](" << v0.getElemNum() << "): ";

        // Szorzás probája
        vt[i] = 10 * v0;
        for (int j = 0; j < n; j++)
           //cout << setw(8) << setprecision(0) << vt[i][j];
           cout << vt[i][j];
        cout << endl;
    }
A for ciklus így is jó lenne!

        for (int j = 0; j < n; j++)
           k++ * v0;
Nem jó még?
Belépés
E-mail cím:
Jelszó:

RSS források
-Hírek
-Cikkek
-Fórumok
-Állás/munka
Top pontgyűjtők
»Micu1.030
»Interlock280
»mezofi150
»Pitta_100
»Frostech0100
»szbzs.2100
»Riha60
»Akhiles50
»mrchandra50
»Bakter50
Top wikieditorok
»Sting
»Doi
»FlamingClaw
»Argathron
»Csaboka2
»Vodka
»Joexy
»Ivn
»Balucinho
»Kelemzol
» ugrás a wikire
A nap kifejezései
»Algoritmus
»Hogyan kezdjem el
»Perl
» ugrás a wikire
Hírek
»Megérkezett a PostgreSQL 9.0 kiadásra jelölt változata
»Letölthető az új Rad Studio XE és Delphi XE
»Function-X digitális művészeti találkozó és demoscene party
»Webfejlesztőknek szóló közösségi oldalt indított a Microsoft
»Letölthető a hardvergyorsított Chrome 7 első fejlesztői kiadása
» több hír
PC Fórum hírek
»Itt az első kép az AMD nyolcmagos processzoráról
»"Szuperdizájnos" érintő-egeret mutatott be a Microsoft
»Szabadalmaztatta a számítógép kikapcsolását a Microsoft
»Vírusriadót váltott ki a webezőknél a Google
»Ingyen iWiW-ezhetnek mobiljaikról a T-Mobile-osok
»Automatikusan kiválogatja legfontosabb leveleink a Google
»OOo4Kids - ingyenes Office csomag gyerekeknek
»Új, gyorsabb Core i3 és Pentium processzorokat jelentett be az Intel
Tagi blogok
»PSP
»Első Programozó
»USB
»PHP, mint sablonmotor egyszerűen