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
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.
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'
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>
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; }
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 string
iä, 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) {}
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!
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.
Eli tosiaan kyseessä on CLR projekti kaipa tämä oikea on, tietenkin toi console voisi olla parempi :)
CLR-projekti (common language runtime) tehnee juuri tuota outoa epästandardia koodia .NET-frameworkin päälle.
Ok, asia selvä. Näkyy toi console pelittävän hieman paremmin :9
Aihe on jo aika vanha, joten et voi enää vastata siihen.