Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++ MFC Application

Sivun loppuun

promoe [16.02.2007 23:02:58]

#

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?

Metabolix [16.02.2007 23:10:51]

#

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ä?

promoe [16.02.2007 23:21:36]

#

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.)

Mazzimo [16.02.2007 23:39:38]

#

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.

promoe [16.02.2007 23:46:00]

#

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.)

Metabolix [16.02.2007 23:54:45]

#

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. :)

promoe [17.02.2007 12:16:45]

#

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?

koo [17.02.2007 14:09:13]

#

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ä.

promoe [18.02.2007 18:15:17]

#

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

koo [22.02.2007 11:16:55]

#

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.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta