Eli olen aika aloittelija koodaushommissa, mutta mieltäni askarruttaa tällainen seikka:
Visual Studio 2005:ttä käytän..
Olen ihan harjoitellut WIN32 Console Application sovelluksilla. Niissä kun olen käyttänyt vektoria siten, että minulla on oma luokka esim. Henkilo ja pääluokka main. Henkilo luokassa olen maaritellyt henkilon ominaisuudet ja main luokassa olen tehnyt henkilo-tyyppisen vektorin näin: vector<Henkilo> vektori;
Mutta tämä ei onnistu minulla mitenkään kun olen yrittänyt tehdä samaa MFC-sovellusta, kun yrittää buildata niin kääntäjä sanoo: undeclared identifier
Kuinka se pitäisi tehdä MFC:n puolella?
Missä main-luokassa? Ettet tarkoittaisi main-funktiota? Muistaakseni sellaista ei MFC-ohjelmissa ole lainkaan näkyvillä (voin toki muistaa väärinkin). Saman henkilöluokan pitäisi kyllä toimia aivan hyvin. Voisit vielä kertoa tarkemmin virheilmoituksesta: undeclared identifier mikä?
ELi vähän harhaanjohtava tuo main-luokka..
Siis luokan nimi on VaalitDlg, jossa on funktio:
void CVaalitDlg::OnBnClickedButtonTayta() { //tässä yritän luoda vektoria.. vector<Henkilo> vektori; }
ja tällainen ilmoitus tulee:
'Henkilo' : undeclared identifier
(Mod. edit. Käytäpä jatkossa kooditageja.)
Et ole määritellyt luokkaa "Henkilo". Ts. Tee headeri, joka sisältää henkilo-luokan. Sitten vaikka includetat sen haluamaasi tiedostoon niin pitäisi toimia. Huom! pitäisi.
Tällainen on minun Henkilo-luokan .h ja .cpp tiedostot..
Henkilo.h:
#pragma once #include <string> using namespace std; class Henkilo { public: Henkilo(string sukunimi, string etunimi, string puolue, int aanimaara,double vertailuluku); public: virtual ~Henkilo(void); public: string sukunimi; string etunimi; string puolue; int aanimaara; double vertailuluku; };
Henkilo.cpp
#include "StdAfx.h" #include "Henkilo.h" #include <string> using namespace std; Henkilo::Henkilo(string sukunimi, string etunimi, string puolue, int aanimaara, double vertailuluku) { this->sukunimi = sukunimi; this->etunimi = etunimi; this->puolue = puolue; this->aanimaara = aanimaara; this->vertailuluku = 0.0; } Henkilo::~Henkilo(void) { }
(Mod. edit. Käytäpä jatkossa kooditageja.)
Henkilo.h pitää liittää (#include) kaikkiin niihin tiedostoihin, joissa kyseistä luokkaa käytetään.
Kirjoitathan suomeksi, jos ei ole erityisesti englanninkielisestä termistä kyse, niin ei satu väärinkäsityksiä mainien kanssa. :)
Sain sen nyt toimimaan, mutta pian sen jälkeen tuli uusi ongelma :)
Kun teen uuden Henkilo-olion näin:
Henkilo *henkilot = new Henkilo(sukunimi,etunimi,puolue,aanimaara,vertailuluku);
tuo vielä menee hyvin kääntäjästä läpi, mutta ku yritän laittaa sitä vektoriin näin:
vektori.push_back(*henkilot);
niin tuo antaa tällaiset virheilmoitukset kun:
afxwin.h(1814) : error C2248: 'CObject::CObject' : cannot access private member declared in class 'CObject'
afx.h(553) : see declaration of 'CObject::CObject'
afx.h(524) : see declaration of 'CObject'
Mitä nuo afxwin.h ja afx.h tiedostot ovat?
Näkyvillä olevien pätkien ja noiden virheilmoitusten välillä ei ole mitään yhteyttä. Kuviossa täytyy olla jotain muuta.
Muuten, miksi luot uuden olion new:lla, kun kerran kopioit sen kumminkin vektoriin?
Henkilo h(jne, ...); vektori.push_back(h);
olisi turvallisempi.
Nuo afxwin.h ja afx.h ovat - yllätys, yllätys - MFC:n headereita, joissa määritellään noin kiljoona MFC:n luokkaa, funktiota ja makrohirvitystä.
Vielä lisää tyhmiä kysymyksiä..
Mikä tarkoitus on projektin asetuksissa näillä unicode tai multi-byte character seteillä?
kun pidän unicodena ja yritän lisätä listcontrolliin kolumnia niin se ei onnistu..
siis näin:
m_listHenkilot.InsertColumn(0, "Nimi", LVCFMT_LEFT, 110);
mutta taas jos laitan multi-byten päälle niin tuo onnistuu, mutta sitten se valittaa noista viestiketjun aiemmista viesteistä esille tullutta virhettä..
tuota:
'Henkilo' undeclared identifier
Jos tämä nyt ei muuta kautta ole jo selvinnyt, niin heitänpä peliin omat arveluni.
Unicode- ja multibyte-asetuksilla on tarkoitus kertoa, millaista merkistöä lopputuloksena olevan ohjelman tai kirjaston on tarkoitus käyttää. Käytännössä se meinaa sitä, mitä kirjastoversioita ohjelma Windows-virityksissään käyttää.
Jos ohjelma rakennellaan Unicode-asetuksilla, ohjelman merkkijonojen pitää olla kanssa Unicode-muotoisia. Windowsissa pitää käyttää 16-bittistä wchar_t
-tyyppiä (siis ei char
). Vakiot pitää kirjoittaa ällän kanssa, muodossa L"Heippa!"
tai L'A'
.
Voi tietysti tehdä just niin kuin Bill tahtoo, eli kirjoittaa aina _TCHAR
sellaiseen paikkaan, johon normaalisti kirjoittaa char
. Merkkivakiot voi kietaista makron sisään _T("Heippa!")
ja _T('A')
. Tällä voimistelulla kaikki merkkitiedon käsittely menee mukamas oikein ihan riippumatta siitä, mitä projektin Unicode/multibyte-asetukset ovat.
Unicode-asetuksilla list control -juttu ei käänny, koska luokan funktio haluaa wchar_t
-osoittimen. Pitää siis sanoa vaikka että _T("Nimi")
.
Multibyte-asetuksilla tuo parametrijuttu menee oikein, mutta se Henkilo-luokan esittely (eli varmaankin headerin includointi) puuttuu. Puuttuu se varmaan Unicode-versiostakin, mutta käännös kämähtää tuohon parametrin tyyppiin sitä ennen eikä tämä vika vain tullut vielä esiin.
Aihe on jo aika vanha, joten et voi enää vastata siihen.