Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Luokka ja string-muuttuja

Sivun loppuun

Toshiba [08.09.2008 13:19:21]

#

Alla oleva koodi kääntyy, mutta kun yritän lisätä string kirjaston ja muuttaa name-muuttujan string tyyppiseksi ei kääntäjä suostu enää kääntämään. Kokeilin myös lisäillä std:: nimiavaruutta headerihin tuloksetta. Olisiko kenelläkään toimivaa esimerkkiä tästä? (Visual Studio 2008 / C++)

//Header//

#pragma once
#include <iostream>

ref class cHahmo
{
private:
	char name;
public:
	cHahmo(char name);
};

---------------------------------------------------

//Luokka//

#include <string.h>
#include "cHahmo.h"

using namespace std;

cHahmo::cHahmo(char y)
{
	name = y;
}

Mod. lisäsi kooditagit

os [08.09.2008 14:55:48]

#

C++-kielen merkkijono-olio std::string on määritelty tiedostossa string (ei .h-päätettä)

#include <string>

class A
{
private:
    std::string name;

    // ...
};

string.h sisältää C:n merkkijonofunktioita. Jos haluat käyttää sitä C++:ssa, niin oikea tapa on #include <cstring>, jolloin funkkarit löytyvät std-avaruudesta.

Toshiba [08.09.2008 15:22:54]

#

Itse asiassa kun headeriin lisään #include <cstring> ja käytän std:: nimiavaruutta string muuttujan edessä kääntäjä antaa vaan error C4368: cannot define 'name'

os [08.09.2008 15:43:06]

#

Mikä johtuu varmaankin siitä, ettei cstring-tiedostossa määritellä C++:n string-olita, vaan tämä määrittely löytyy tiedostosta string, kuten yritin sanoa (ehkä turhan epäselvästi). Unohda cstring ja kirjoita headeriisi

#include <string>

Toshiba [08.09.2008 17:00:10]

#

Virhe: error C4368: cannot define 'nimi' as a member of managed 'testi': mixed types are not supported

Header:

#pragma once
#include <string>
ref class testi
{
private:
	std::string nimi;
public:
	testi(std::string nimi);
};

Cpp tiedosto

#include "testi.h"
#include <string>

using namespace std;

testi::testi(string nimi)
{
	nimi = nimi;
}

os [08.09.2008 17:22:39]

#

Saamasi virheilmoitus liittyy Googlen mukaan käyttämääsi Microsoftin .NET-alustalle tarkoitettuun ei-standardiin C++-koodiin. Et siis voi laittaa "ref"-luokan sisään datajäseneksi "ei-ref" -olioita, kuten standardi-C++:n stringiä, vaan joudut joko varaamaan näille muistia dynaamisesti tai käyttämään jotakin Microsoftin korvaavia viritelmiä. Koodisi toki kääntyy ilman ref-määrettä. Kannattaa muuten muuttaa konstruktoria, jos haluat, että luokka toimii järkevästi.

Eli joko näin

testi::testi(string uusi_nimi) { nimi = uusi_nimi; }

tai näin

testi::testi(string nimi) : nimi(nimi) {}

Toshiba [08.09.2008 18:05:33]

#

KIITOKSIA OS! Tosiaan poistamalla ref lähti kääntymään hyvin :) Näköjään moni asia muuttunut visual studion uudemmassa versiossa ja toi ref tulee automaattisesti generoimalla. Ilmeisesti pointterit ovat saaneet myös uuden merkintätavan!

Mutta kiitoksia avusta!

os [08.09.2008 18:20:55]

#

Eipä kestä. Kannattaa vielä katsoa Visual Studion asetuksista, ettet epähuomiossa ole valinnut jonkinlaista C++/CLI-projektia normaalin C++-projektin sijaan. Nuo "uudet merkinnät" liittyvät siis Microsoft .NET:in CLI-järjestelmään, eivätkä sinällään Visual Studioon tai normaaliin C++:aan.

Toshiba [08.09.2008 21:11:32]

#

Eli tosiaan kyseessä on CLR projekti kaipa tämä oikea on, tietenkin toi console voisi olla parempi :)

Blaze [08.09.2008 21:15:20]

#

CLR-projekti (common language runtime) tehnee juuri tuota outoa epästandardia koodia .NET-frameworkin päälle.

Toshiba [08.09.2008 21:54:59]

#

Ok, asia selvä. Näkyy toi console pelittävän hieman paremmin :9


Sivun alkuun

Vastaus

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

Tietoa sivustosta