[C++]error C2059

0

Mam dziwny problem z visual c++ express, próbuje w klasie zrobić strumień do pliku jednak wywala mi taką linijke błędu:
"...\resources.h(9): error C2059: syntax error : 'string'"

#pragma once
#include <iostream>

using namespace std;

class resources
{
public:
	ifstream mspath("mainscript.sc");
	resources(void);
	~resources(void);
};

O co chodzi ??
Czy można podać do ifstream nazwe pliku funkcją zwracającą string??
Jak podać do ifstream ścieżke do pliku ( np. /module/mscript.sc) skoro "/znak" wykrywa jako tzw. biały znak??

0

ew. jak utworzyć obiekt/strumień w funkcji, tak a bym miał dostęp do niego poza funkcją?

0
ifstream mspath("mainscript.sc");

Umieśc to w jakiejś metodzie.. I pamietaj o bibliotece!

0

Teraz to to bardziej na deklarację metody zwracającej ifstream wygląda.
W pliku nagłówkowym zadeklaruj samo pole ifstream mspath;, a w konstruktorze sobie otwórz ten stream, mspath.open().

Czy można podać do ifstream nazwe pliku funkcją zwracającą string??
Jak najbardziej tak.

Jak podać do ifstream ścieżke do pliku ( np. /module/mscript.sc) skoro "/znak" wykrywa jako tzw. biały znak??
Od kiedy? Znakiem wyjścia jest \.

0

mój błąd przy pisaniu posta, miałem na myśli oczywiście \ . Ale jak już mówiłem wychodzi biały znak. Chyba że IDE mi źle koloruje to miejsce. ( po "" nadal koloruje na czerwono)

EDIT: przekombinowałem chyba, dzięki za pomoc.

0

No i wyjdzie teraz jak to nie lubiłem wcześniej klas i obiektów:

resources.h :

#pragma once
#include <iostream>
#include <fstream>
#include <string>

using namespace std;

class resources
{
public:
	int line;
	string activeline;
	ifstream msfile;
	ifstream chfile;
	void nextline();
	resources(void);
	~resources(void);
}

resources.cpp:

#include "resources.h"
#include <iostream>

resources::resources(void)
{
	msfile.open("mainscript.sc");
	chfile.open("characters.sc");
	line = 0;
}


resources::~resources(void)
{
}

void nextline()
{
	resources::line = resources::line + 1;
}

Daje mi błędy:
illegal reference to non-static member 'resources::line'
'resources::line': function call missing argument list; use '&resources::line' to create a pointer to member

Jak w takim razie mogę zwiększyć wartość line o 1??
I dlaczego skoro w konstruktorze nie musiałem pisać skąd pochodzi line, to musze pisać w definicji nextline()? ( samego line mi tam nie rozpoznaje)

PS: Nie chciałem zakładać nowego wątku, czy jakiś uprzejmy moderator mógłby uogólnić nazwe tematu ( nie byłem wtedy jeszcze zarejstrowany).

0

Może najzwyczajniej sięgnij po książkę? Przecież o programowaniu obiektowym nie wiesz nic, a to nie jest temat, który można zawrzeć w 10 zdaniach.

Metoda, którą definiujesz jest przecież w jakiejś klasie, prawda? To dlaczego piszesz void nextline? Skąd kompilator ma wiedzieć, że to nie jest zwykła funkcja, tylko metoda klasy resources (nie, po nazwie pliku w którym się znajduje nie będzie wiedział). Póki co, kompilator uznaje ją jako zwykłą funkcję i widzi, że próbujesz odwołać się do statycznego pola, które.. nie jest statyczne (o czym mówi ci treść błędu).

Tak więc na początek będzie void resources::nextline().

Dalej. Odwołując się do pola klasy poprzez nazwaklasy:: próbujesz odwołać się do statycznego pola. Wiesz co robi modyfikator static?

Zamień to na: this->line++;.

0
void nextline()
{
        resources::line = resources::line + 1;
}

a) nextline jest częścią klasy resources, musisz więc pisać void resources::nextline().
b) Gdy chcesz ustalać zmienną należącą do modyfikowanego obiektu, zamiast resources::cośtam używasz this->cośtam (czyli jakaś wartość należąca do własnego obiektu).

Edit: za późno :/

0

Ucze się pisząc :) Ale trochę już wcześniej umiałem . ( Ogólnie wróciłem do programowania po przerwie, obiektowe wcześniej ledwo tknąłem)
Głównie ucze się na błędach.

Ale błędy tam gdzie ich wcześniej nie było mnie denerwują (kon- i destruktory generowane przez visuala):

resources.cpp(5): error C2533: 'resources::{ctor}' : constructors not allowed a return type

resources.h

#pragma once
#include <iostream>
#include <fstream>
#include <string>

using namespace std;

class resources
{
public:
...
resources(void);
~resources(void);
}

resources.cpp

#include "resources.h"
#include <iostream>

resources::resources(void)
{
	msfile.open("mainscript.sc");
	chfile.open("characters.sc");
	line = 0;
}


resources::~resources(void)
{
}
...

game.h(5): error C2143: syntax error : missing ';' before 'using'
game.cpp(6): error C2533: 'game::{ctor}' : constructors not allowed a return type

game.h

#pragma once
#include "resources.h"
#include <string>

using namespace std;

class game
{
private:
...
public:
...
game(void);
~game(void);
}

game.cpp

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


game::game(void)
{
	game::stan = start;
	gloadres();
}

game::~game(void)
{
	game::stan = end;
}
...

i ostatni: main.cpp(4): error C2143: syntax error : missing ';' before 'using'

main.cpp

#include "game.h"
#include "resources.h"

using namespace std;

void main()
{
	game gra;
}

Tam gdzie wywala brak ";" przed using dostawiłem go i tych błędów nie było, ale nie wiem po co on tam.

0

Brakuje Ci ; po definicjach klas

0

Dzięki, myślałem że je samemu dopisałem przez przypadek i je pousuwałem.

Następne pytanie: Chce zrobić porównanie pojedynczego znaku w stringu z cudzysłowem. Jak to zapisać ?? Gdy robię

if (line[i] = """ );

To zamyka mi pierwszego stringa między cudzysłowami i otwiera drugiego i nie kończy.

0
if (line[i] == "\""){
...
}
  • daje mi:
    '==' : no conversion from 'const char *' to 'int' There is no context in which this conversion is possible

line jest typu string of course

0

To chcesz porównywać stringi czy znaki? Albo lina == """, albo linia[i] == '"'

0

Znaki w stringach :), dzięki działa, choć chwile wcześniej poradziłem sobie wpisująć kod ASCI "

0

ehhh...Ogólnie pisze prosty silnik/interpreter gier/skryptów , na standardowe wyjścia. Przy tym problemie wcześniejsze to pikuś. Po każdej zmianie w kodzie sprawdzam, czy to co ma działać działa. Program się kompiluje, jednak przy uruchomieniu wyrzuca mi że w stringu wychodze po za zasięg. Debugując ( step into itd. w vc++) wywala mi błąd przy i = 5 w funkcji changestring()
plik mainscript.sc:

write "Hello gamer"

plik main.cpp

#include "game.h"
#include "resources.h"
#include <conio.h>

using namespace std;

void main()
{
	game gra; // tworzy główny obiekt
	getch();
}

game.h


#pragma once
#include "resources.h"
#include <string>

using namespace std;

class game
{
private:
	enum state { start = 0, ingame = 3, end = 4, paused = 5}; // później posprzątam, mały bałagan koncpecyjny
	state stan;
	resources ms; 
public:
	game(void);
	void gingame();
	void gpause();
	~game(void);
};

game.cpp

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


game::game(void)
{
	game::stan = start;
	gingame();
}

game::~game(void)
{
	game::stan = end;
}

void game::gpause()
{
	game::stan = paused;
}

void game::gingame()
{
	game::stan = ingame;
	while(!ms.msfile.eof())// sprawdza czy plik się skończył
	{
		ms.nextline();//odpala interpratacje kolejnej lini w pliku
	}
}

resources.h

#pragma once
#include <iostream>
#include <fstream>
#include <string>
#include "scriptline.h"

using namespace std;

class resources
{
public:
	int line; // numer lini.przyda się później przy odniesieniach
	string activeline; // później usune, chwilowo zmienna pomocnicza
	scriptline active; // aktywna linia 
	ifstream msfile; // strumień głównego skryptu
	void interpretuj();
	void nextline(); 
	resources(void);
	~resources(void);
};

resources.cpp

#include "resources.h"
#include <iostream>

resources::resources(void)
{
	msfile.open("mainscript.sc");
	line = 0;
}


resources::~resources(void)
{
}

void resources::nextline()
{
	this->line = this->line + 1; // zwiększa numer lini
	getline(msfile,activeline); // pobiera aktywną linie do pliku pomocniczego
	active.changestring(activeline); // ładuje linie do scriptline, aby podzielił ją na wyrażenia
	interpretuj();
}

void resources::interpretuj(){
	if (active.words[0] == "write")
	{
		cout << active.words[1] << endl;
	}
}

scriptline.h

#pragma once
#include <string>
#include <vector>

using namespace std;

class scriptline
{
public:
	string scline; // zawiera całą linie, może będe potrzebować
	vector<string> words; // wektor ze słowami
	scriptline(void);
	void changestring(string line); // aktualizacja obiektu
	~scriptline(void);
};

scriptline.cpp

#include "scriptline.h"


scriptline::scriptline()
{
}


scriptline::~scriptline(void)
{
}

void scriptline::changestring(string line)
{
	scline = line;
	string tmp;
	unsigned int i = 0; // licznik zewn., łatwiej mi było wyobrazić sobie to na pętli while
	while (i<line.length())
	{
		if (line[i] == '"') // jeśli jest w cydzosłowach  to co między nimi ma trafić jaką jeden element wektora ( jako np. pojedynczy parametr komendy)
		{
			i++;
			while (line[i]!= '"')
			{
				tmp = tmp + line[i]; // dadajemy znaki do tmp , póki nie spotkamy cudzysłowiu
				i++;
			}
			words.push_back(tmp); // dodajemy na końcu wektora nasz łańcuch
			tmp.clear(); // czyścimy  tymczasowy string
		}

		else 
		{
			while(line[i] != ' ') // co spacje kolejne słowo
			{
				tmp = tmp + line[i];
			i++;
			}
			words.push_back(tmp);
			tmp.clear();
			i++;
		}
	}
}

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.